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_timehistory_edithistory_userhistory_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中的表名中查找模型实例

Django-如何在一个字段中添加同一模型的多个实例

Django 查询查找 somefilefield == None 的模型实例?

将子类模型实例转换为 django 中的另一个子类模型实例?

在 Django 中,如何让模型引用自身?