2014-12-02 79 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

相关问题