Django model.save(): 检查是否有内容更改

1 投票
1 回答
6840 浏览
提问于 2025-04-18 06:00

这个问题很简单:

有没有办法检查一个实例的任何字段在调用model.save()方法时是否被修改过?或者说,其他方法,比如.clean()呢?

关键是你不能明确地列出要检查的字段。

有没有什么简单的方法可以做到这一点?

1 个回答

2

获取所有字段名称的方法:

[field.name for field in MODEL._meta.fields]

通过字段名称(字符串形式)检查字段值的方法:

getattr(obj, field_name)

你可以像这样修改这个Django:保存时,如何检查字段是否已更改?的回答:

def save(self, *args, **kw):
    if self.pk is not None:
        orig = MyModel.objects.get(pk=self.pk)
        field_names = [field.name for field in MyModel._meta.fields]
        fields_stats = {}
        for field_name in field_names:
            fields_stats[field_name] = getattr(orig, field_name) != getattr(self, field_name)
    super(MyModel, self).save(*args, **kw)

字典field_stats的样子会是:

{
    'field_name1': True,
    'field_name1': False,
}

其中True表示字段已经更改,而False表示字段没有更改。

撰写回答