2013-04-18 26 views
2

我有我的models.py如何检查模型中的特定字段更改?

class Hotel(models.Model): 
    name = models.CharField(max_length=20) 
    currency = models.ForeignKey(Currency) 


class Currency(models.Mode): 
    code = models.CharField(max_length=3) 
    name = models.CharField(max_length=10) 

每当在酒店的currency领域正在发生变化,我需要能够做一些事情。所以我有这样一个功能:

@receiver(pre_save,sender=Hotel) 
def update_something(sender,**kwargs) 
    obj = kwargs['instance'] 
    old_object = Hotel.objects.get(pk=obj.pk) 
    ''' 
    Now I can do anything here comparing the oldo object with the instance 
    ''' 

的事情是我不想让这个查询,从此信号的目的变得愚蠢和我成为傻子。

所以我应该可以做这样的事情:

updated = kwargs['update_fields'] 
new_currency = updated['currency'] 

是他们的办法,我可以找出是只改变一个特定领域说currency,而不是做这样的查询。我想在保存之前获取与currency外键相关的更改并更新内容。

对不起,我的英语不好,不能使用太专业术语。

谢谢:)

+0

我想你会发现你需要的一切:http://stackoverflow.com/questions/1197674/actions-triggered-by-field-change-in-django。你可以使用__init__和__save__方法重写它们,或者重写__setter__! – Ricola3D

+0

[Django:保存时,如何检查字段是否已更改?]的可能重复(http://stackoverflow.com/questions/1355150/django-when-saving-how-can-you-check-if-一个场-具有改变的) – Martey

回答

1

而哈克的解决办法是,以节省初始化对象的状态。

from django.forms.models import model_to_dict 

class Currency(models.Mode): 
    code = models.CharField(max_length=3) 
    name = models.CharField(max_length=10) 

    def __init__(self): 
     super(Currency, self).__init__() 
     self.__state = model_to_dict(self) 

    def updated(self): 
     new_state = model_to_dict(self) 
     return dict(set(self.__state.iteritems()) - set(new_state.iteritems())) 

方法updated将返回初始和新状态之间的差异。

2

的信号点是更好的去耦 - 允许其他应用程序(你不一定知道还)透明地挂接到您的应用程序和/或避免应用程序之间的循环依赖。在这里使用信号确实没有意义(除非信号处理程序在另一个应用程序中,并且您不希望具有HotelCurrency模型的应用程序依赖于此其他应用程序)。

要回答你的问题:做一个查询来检索原始状态是唯一可以比较存储值和当前值的方法。现在,如果你只是在一个特定领域的兴趣的话,你当然不必检索整个模型的实例 - 只需使用queryset.values_list

old_currency = Hotel.objects.filter(pk=obj.pk).values_list("currency", flat=True)[0] 
相关问题