gpt4 book ai didi

django - 将项目值更改记录到 Django 对象

转载 作者:行者123 更新时间:2023-12-01 23:30:59 25 4
gpt4 key购买 nike

目前我正在考虑如何最好地实现模型更改的日志记录,以便为对象提供某种形式的审计跟踪。

我研究了 django-reversion,在某种程度上它做了我需要它做的事情,但是我的需求比这更简单。我只想要能够记录哪个用户何时更改了对象上的哪个字段,以及提交更改之前该字段的先前值。

一个简单的类来存储它,如下所示:

class AuditLogEntry(models.Model):
user = ForeignKey(User, verbose_name=_(u"user"), related_name="actions")
obj = ForeignKey(ModelToLog, verbose_name=_(u"Model"), related_name="history")
timestamp = DateTimeField(default=datetime.now)
field = models.CharField(max_length=64)
value = models.CharField(max_length=256)

目前,我正在考虑简单地在 View 处理程序中添加一段代码,以如下方式更新模型:

form = ModelToLogForm(request.POST, instance=obj)
prev_data = dict()
for changed_field in form.changed_data:
prev_data[changed_field] = form.instance.get_attribute(changed_field)
if form.is_valid():
form.save()
for changed_field in keys(prev_data):
obj.history.create(user=request.user, obj=obj, field=changed_field, value=prev_data[changed_field]

从理论上讲,它应该有效,但是我一直有一种轻微的感觉,这不是最好的方法。有没有更好的方法来做这样的事情?

最佳答案

你的方法有一个小问题。如果从代码中的其他地方更改模型会发生什么?您不想将这个历史记录跟踪代码散布到各处。调查信号,这就是 zobbo 提到的 django 管理历史解决方案所使用的信号。

关于django - 将项目值更改记录到 Django 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com