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在保存之前获取与外键相关的更改并更新内容。

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

谢谢 :)

4

2 回答 2

2

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

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

old_currency = Hotel.objects.filter(pk=obj.pk).values_list("currency", flat=True)[0]
于 2013-04-18T11:47:09.653 回答
2

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

于 2013-04-18T12:02:19.533 回答