Django 在同一模型实例中查找差异
Posted
技术标签:
【中文标题】Django 在同一模型实例中查找差异【英文标题】:Django Find difference in the same model instance 【发布时间】:2022-01-12 01:20:09 【问题描述】:我一直在四处寻找,但我认为我还没有找到答案。但我希望能够找到数据的差异,并有一个列名列表来表明这一点。
例如,我有一个名为 my_model 的模型,它有一些列。
object = my_model.objects.get(id=1)
# Perform edit some values.
old_object = my_model.objects.get(id=1)
object.save()
# Check for differences
model_fields = [field.name for field in my_model._meta.get_fields()]
filtered_list = filter(lambda field: getattr(object, field, None) != getattr(old_object, field, None), model_fields)
这样做的目的是在用户进行更新后通知用户,以便向该用户发送电子邮件,提醒他们他们更改了所更改的任何值。
【问题讨论】:
库django-simple-history
可能对您有用。
@RossRogers 我确实看到了,我的问题是这会增加处理时间的开销有多大?
django-simple-history
添加了一个包含所有相同字段的并行表,以及一些历史字段,如history_time
、history_edit
、history_user
、history_change_reason
。当您查看差异时,您查询该审计表,与您的普通表完全分开。您可以像Foo.history.filter(id=42, history_time_gte='2021-12-06-19:30')
等一样访问它。无论如何,单独的数据,所以超过两倍的数据大小。取决于您的要求,但我发现它很容易。想要审计表? history = HistoricalRecords()
在那个模型上,然后砰!完成。
【参考方案1】:
能够回答我自己的问题。将这两个对象转换为字典。我最终得到了类似的东西
dict1, dict2 = obj1.__dict__, obj2._dict__
changed_fields =
'column_names': []
excluded_keys = '_state'
for k,v in dict1.items():
if k in excluded_keys:
continue
try:
if v != dict2[k]
changed_fields['column_names'].append(k)
except KeyError:
# Put error handling
continue
【讨论】:
以上是关于Django 在同一模型实例中查找差异的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 Django 反向 FK 查找在 CBV 中显示子模型的实例
Django 查询查找 somefilefield == None 的模型实例?