我有一个Machine
模型:
class Machine(models.Model):
name = models.CharField(max_length=12)
type = models.ForeignKey(to=TypeModel)
using = models.BooleanField(default=False)
group = models.ManyToManyField()
我要记录Machine
实例的create
,update
和destroy
记录。
因此,我有一个MachineRecord
模型:
class MachineRecord(models.Model):
editor = models.ForeignKey(to=User)
machine = models.ForeignKey(to=Machine)
old_content = models.CharField(max_length=1024, null=True, blank=True)
new_content = models.CharField(max_length=1024, null=True, blank=True)
ctime = models.DateTimeField(auto_now_add=True)
但是,我的问题是创建和更新Machine
实例的地方很多。是否可以在集中的位置(例如在Machine类中)为Machine实例创建MachineRecord实例?
我的意思是,如果实例在任何地方创建,更新,销毁,我只需要注意记录数据的集中位置。
EDIT-01
有很多说法重写机器的save()方法:
class Machine(models.Model):
...
def save(*args, **kwargs):
before_do_something()
super().save(*args, **kwargs)
after_do_something()
但是ManyToManyField
呢?我也想在
old_content
和new_content
。
更重要的是editor
是request.user
(称为UpdateAPI)。
答案 0 :(得分:-1)
Django信号可用于此目的。
您可以在诸如pre_save,post_save,post_delete等事件上注册侦听器。
您甚至可以创建自己的信号。
文档:https://docs.djangoproject.com/en/2.1/topics/signals/
唯一的缺点可能是很难跟踪问题(如果发生),尤其是如果有更多的人在项目上工作并且不了解信号的使用