Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在方便的地方记录实例的创建、编辑和销毁?_Python_Django_Django Rest Framework - Fatal编程技术网

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

Python 如何在方便的地方记录实例的创建、编辑和销毁?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个机器型号: 我想记录机器实例的创建、更新和销毁记录。 因此,我有一个机器记录模型: 但是,我的问题是有很多地方可以创建和更新机器实例。我是否可以在集中的位置(例如在Machine类中)为Machine instance创建MachineRecord实例 我的意思是,如果一个实例在任何地方创建、更新、销毁,我只会注意记录数据的集中位置 编辑-01 有许多说法称,重新编写机器的保存方法: class Machine(models.Model): ... def save(*args,

我有一个机器型号:

我想记录机器实例的创建、更新和销毁记录。 因此,我有一个机器记录模型:

但是,我的问题是有很多地方可以创建和更新机器实例。我是否可以在集中的位置(例如在Machine类中)为Machine instance创建MachineRecord实例

我的意思是,如果一个实例在任何地方创建、更新、销毁,我只会注意记录数据的集中位置

编辑-01

有许多说法称,重新编写机器的保存方法:

class Machine(models.Model):
  ...
  def save(*args, **kwargs):
    before_do_something()
    super().save(*args, **kwargs)
    after_do_something()
但是曼尼托曼尼菲尔德怎么样?我还想把小组简报记录在 旧内容和新内容


更重要的是编辑器是request.userwho调用UpdateAPI。

Django信号可用于此

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

你甚至可以创建自己的信号

文件:


唯一的缺点可能是,如果出现问题,很难跟踪问题,特别是如果有更多的人在项目中工作,并且不知道信号的使用

Machine.save有什么问题@Brunodesshuilliers机器中有很多字段如何?@Brunodesshuilliers你可以查看我的EDIT-01。@Brunodesshuilliers是的,我知道。但我不同意。我不会称之为反模式。即使在文章中,它也说它有它的用处。这个问题实际上是信号的一个很好的例子——据我所知——他只是想记录一个事件。我认为信号是一个很好的解决方案。相反,我并不是说信号是无用的,只是将它们用于模型方法中已经可以做的事情——这里就是这种情况——是一种反模式。信号的主要目的是为其他应用提供连接点。我没有等到lincolnloop发表这篇文章,我自己就发现了这一点——这其实只是普通的常识,如果你想在调用某个models方法时做一些特殊的事情,那么一个简单、易读且可维护的解决方案就是重写这个方法。@Brunodesshuillers是的,没错。我同意你的看法。我在回答中提到,很难找到一个问题,这就是为什么它不应该用于与模型有关的东西。但是,我认为,在这种情况下,如果我理解这只是某种事件日志记录,那么他拥有的日志记录机制可以从模型中删除-如果不是,它更与实际模型相关,那么它需要成为模型的一部分,读取OP的代码-它显然与实际模型相关,而不仅仅是某种事件日志记录。但无论如何,我解释了我的观点,就我而言,没有必要进一步辩论,OP实际上可能需要M2M改变信号FWIW,cf编辑的问题。
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)
class Machine(models.Model):
  ...
  def save(*args, **kwargs):
    before_do_something()
    super().save(*args, **kwargs)
    after_do_something()