【问题标题】:Tracking changes to all models in Django跟踪 Django 中所有模型的更改
【发布时间】:2017-07-14 23:34:23
【问题描述】:

我正在开发一个 Django + DRF Web 应用程序,我想跟踪数据库中所有模型实例的更改并记录所有所做的更改,即:

TABLE - Table to which record was added/modified
FIELD - Field that was modified.
PK_RECORD - Primary Key of the model instance that was modified.
OLD_VAL - Old Value of the field.
NEW_VAL - New Value of the field.
CHANGED_ON - Date it was changed on.
CHANGED_BY - Who changed it?
REVISION_ID - Revision ID of the current Model Instance.

稍后,我希望用户能够跟踪对模型所做的更改,并查看哪个版本的实例用于特定操作,以便跟踪所有内容。

为此,我试图了解 django 中用于跟踪数据库模型更改的各种包,其中一些在这里列出:

django-model-audit packages

我尝试了django-reversiondjango-simple-historydjango-audit-logdjango-historicalrecords,但我不明白我应该如何以及为什么要使用这些包中的每一个,因为其中一些包对于要求来说似乎是矫枉过正。所以,经过两天的搜索和阅读大量关于我应该如何跟踪模型变化的帖子后,我基本上什么也没做。

我是 Django 新手,希望能得到任何帮助。

如果有不清楚的地方,请随时评论您的疑问。在此先感谢:)

【问题讨论】:

  • 您是否还实现了跟踪更改以反转相关字段更改?您能否提供要点或存储库链接?我将实施相同的方法。
  • 嘿.. 抱歉,这已经超过两年了。我不完全记得我是怎么做到的。我认为我们保留了更改的记录,因为在哪个日期在哪个表中的哪个记录上更改了哪些键和值。我们只保留了该记录的新值和旧值,并为此使用了 JSON 字段。由于各种字段可以有各种类型,我们决定将所做的更改保存为更改表中 JSONObject 中的 {key:pair} 。那有意义吗?如果没有,或者给我发消息。

标签: python django django-models database-versioning


【解决方案1】:

你探索过 django 信号 pre_save 吗?https://docs.djangoproject.com/en/dev/topics/signals/

from django.db.models.signals import pre_save          
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_save, sender=MyModel)
def my_handler(sender, instance=None, **kwargs):
    # instance variable will have the record which is about to be saved. 
    # So log your details accordingly.

【讨论】:

  • 请注意,虽然批量操作不会触发信号,但不会记录这些更改。
  • @ThierryJ。什么是批量操作?能举个例子吗?
  • MyModel.objects.bulk_create(my_model1, my_model2)。这将创建参数中给出的所有MyModel 实例。但这将使用单个数据库查询一次创建它们。这个动作不会触发任何信号。函数bulk_update 的工作原理类似。有关详细信息,请参阅docs.djangoproject.com/en/2.2/ref/models/querysets/#bulk-create
  • 但是无论保存是否成功,这里都会执行日志记录更改 - 如果我们将有 IntegrityError,则处理程序无论如何都会保存日志 - 但这是不正确的:保存未成功。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多