如何在方便的地方记录实例的创建,编辑,销毁?

时间:2018-10-04 08:59:43

标签: python django django-rest-framework

我有一个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实例的createupdatedestroy记录。 因此,我有一个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_contentnew_content

更重要的是editorrequest.user(称为UpdateAPI)。

1 个答案:

答案 0 :(得分:-1)

Django信号可用于此目的。

您可以在诸如pre_save,post_save,post_delete等事件上注册侦听器。

您甚至可以创建自己的信号。

文档:https://docs.djangoproject.com/en/2.1/topics/signals/

唯一的缺点可能是很难跟踪问题(如果发生),尤其是如果有更多的人在项目上工作并且不了解信号的使用