from django.db.models import signals
from django.dispatch import receiver
from django.utils.timezone import now
# 假设我们有一个模型 `MyModel` 和一个与之相关的日志模型 `LogEntry`
class MyModel(models.Model):
name = models.CharField(max_length=100)
class LogEntry(models.Model):
mymodel = models.ForeignKey(MyModel, on_delete=models.CASCADE)
action_time = models.DateTimeField(auto_now_add=True)
action = models.CharField(max_length=100)
# 接收模型保存信号并创建日志条目
@receiver(signals.post_save, sender=MyModel)
def log_create(sender, **kwargs):
if not kwargs.get('created', True):
return
LogEntry.objects.create(
mymodel=kwargs['instance'],
action='Created',
action_time=now()
)
# 接收模型删除信号并创建日志条目
@receiver(signals.post_delete, sender=MyModel)
def log_delete(sender, **kwargs):
LogEntry.objects.create(
mymodel=kwargs['instance'],
action='Deleted',
action_time=now()
)
这个简单的例子展示了如何使用Django的信号机制来记录模型的创建和删除操作。每当有MyModel
实例被创建或删除时,相应的信号会被触发,并调用log_create
和log_delete
函数,这两个函数会在相应的条件下创建LogEntry
实例。这种方式使得日志记录的代码与业务逻辑分离,增强了代码的可维护性和可读性。