如何确定Django模型中的字段是否已更改

时间:2016-03-08 22:14:53

标签: django django-forms

我很惊讶这很难做到。但是我想出了这个,这似乎至少对我的简单案例起作用。任何人都可以推荐更好的方法吗?

def field_changed(self, fieldname):
    """Tests if the value of the field changed from the original data"""
    orig_value = self.fields[fieldname].initial or getattr(self.instance, field, None)
    orig_value = getattr(orig_value, 'pk', orig_value)
    if type(orig_value) is bool:
        # because None and False can be interchangeable
        return bool(self.data.get(fieldname)) != bool(orig_value)
    else:
        return unicode(self.data.get(fieldname)) != unicode(orig_value)

4 个答案:

答案 0 :(得分:15)

表单包含一个属性changed_data,其中包含值已更改的所有字段的列表。

尝试:

'fieldname' in myforminstance.changed_data

答案 1 :(得分:7)

您似乎已经彻底改造了has_changed方法。

答案 2 :(得分:1)

扩展到Airs's answer,用于多个字段:

在您要跟踪字段['field_a', 'field_b', 'field_c']

的更改的情况下

如果您要检查这些字段中的任何是否已更改:

any(x in myforminstance.changed_data for x in ['field_a', 'field_b', 'field_c'])

如果您要检查这些字段的所有是否已更改:

all(x in myforminstance.changed_data for x in ['field_a', 'field_b', 'field_c'])

答案 3 :(得分:0)

您必须覆盖方法post_save。在Django中,重写方法是一种很好的做法:https://docs.djangoproject.com/en/dev/ref/signals/#post-save

我建议你在你的模型类中添加这样的东西:

    def post_save(self, sender, instance, created, raw, using, update_fields):
        if 'the_field' in update_fields:
           # Do whatever...