2014-12-02 133 views
1

我想知道django的save()是如何工作的。還有一些我不明白的東西。有什麼方法可以知道現在正在更新的字段?django知道哪些字段已更新?

我所知道的最好的方法是使用pre_save()信號和做水木清華這樣的:

current_field_val = instance.my_field 
old_field_val == sender.objects.get(pk=instance.pk).my_field 
if current_field_val != old_field_val: 
    # do smth 

但我不希望從數據庫中選擇。以及DjangoORM如何知道需要更新的字段,還是更新模型中的所有字段(在我看來,這是奇怪的行爲)。

+0

https://github.com/smn/django-dirtyfields – madzohan 2014-12-02 20:46:12

+1

有類似的問題http://stackoverflow.com/questions/110803/dirty-fields-in-django – madzohan 2014-12-02 20:47:58

回答

0

你可以使用這樣的事情:

class myClass(models.Model): 
    my_field = models.CharField() 

    __my_field_orig = None 

    def __init__(self, *args, **kwargs): 
     super(myClass, self).__init__(*args, **kwargs) 
     self.__my_field_orig = self.my_field 

    def save(self, force_insert=False, force_update=False, *args, **kwargs): 
     if self.my_field != self.__my_field_orig: 
      # my_field changed - do something here 

     super(myClass, self).save(force_insert, force_update, *args, **kwargs) 
     self.__original_name = self.name 
+0

感謝。我也知道這種方式,我只想找到默認解決方案。例如RoR的ORM允許這樣的: 'recod.title = 「someothertitle」'' record.changes' '{ 「標題」=> [ 「sometitle」, 「someothertitle」]}' 同時,我想知道Django是如何行事的。它是更新所有領域還是保持某處領域改變..?如果它的行爲在第二種方式 - 爲什麼Django不想給我這個信息:) – 2014-12-02 20:43:45

+0

@VladimirSolovyov是兄弟你的權利:)。這是一個好主意,在django :) :) – 2014-12-02 20:48:12

0

在視圖中,可以使用form.changed_data找出哪些數據的形式被改變。

E.g.

if 'yourfield' in form.changed_data`: 
    (do something) 
+0

哦,我不知道。這更好。謝謝。但它並不能涵蓋所有需要。正如Hasan Ramezani所說 - '在django中貢獻是個好主意':) – 2014-12-02 21:00:21

相關問題