2016-03-08 72 views
2

我很驚訝這很難做到。然而,我想出了這個,這似乎至少對我的簡單情況起作用。任何人都可以推薦更好的方法?如何確定Django模型中的字段是否已更改

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) 

回答

3

看來您已經重新創建了has_changed方法。

+0

有疑問時,搜索文檔;或者我也發現檢查Django代碼是找到所有可用方法的好方法。 –

+0

是的,django的源代碼是有據可查的,它在某些方面是相當有教益的。同樣好的IDE可以幫助您從項目文件中輕鬆訪問源代碼。 – alTus

6

表單包含一個屬性changed_data,其中包含所有其值已更改的字段的列表。

嘗試:

'fieldname' in myforminstance.changed_data 
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... 
+0

信號的重點不是重寫,而是聽信號 – Matt

相關問題