我有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
外键相关的更改,并在保存之前更新内容。
抱歉我的英语不好,而且无法使用过于技术性的术语。
谢谢:)
答案 0 :(得分:2)
信号点更好地解耦 - 允许其他应用程序(您还不一定知道)透明地挂钩到您的应用程序和/或避免应用程序之间的循环依赖关系。在这里使用信号真的没有意义(除非信号处理程序在另一个应用程序中,并且您不希望具有Hotel
和Currency
模型的应用程序依赖于此其他应用程序)
回答您的问题:执行查询以检索原始状态是您可以比较存储值和当前值的唯一方法。现在,如果您只对某个特定字段感兴趣,那么您当然不必检索整个模型实例 - 只需使用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
将返回初始状态和新状态之间的差异。