如何检查模型中的特定字段更改?

时间:2013-04-18 09:09:08

标签: python django orm signals django-signals

我有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']

他们是否可以找到 ONLY 一个特定字段的更改说currency,而不是像这样进行查询。我希望得到与currency外键相关的更改,并在保存之前更新内容。

抱歉我的英语不好,而且无法使用过于技术性的术语。

谢谢:)

2 个答案:

答案 0 :(得分:2)

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

回答您的问题:执行查询以检索原始状态是您可以比较存储值和当前值的唯一方法。现在,如果您只对某个特定字段感兴趣,那么您当然不必检索整个模型实例 - 只需使用queryset.values_list

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

答案 1 :(得分:1)

相当hacky解决方案是在初始化时保存对象状态。

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将返回初始状态和新状态之间的差异。