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

Python 如何检查模型中的特定字段更改?,python,django,orm,signals,django-signals,Python,Django,Orm,Signals,Django Signals,我有我的型号。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) 每当酒店中的货币字

我有我的
型号。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)
每当酒店中的
货币
字段发生变化时,我需要能够做一些事情。所以我有一个函数,比如:

@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']
这是一种方法,我可以找到一个特定字段的更改,比如说
货币
,而不是像这样进行查询。我想在保存之前获取与
货币
外键相关的更改并更新内容

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


谢谢:)

信号的要点是更好的解耦-允许其他应用程序(您还不一定知道)透明地连接到您的应用程序和/或避免应用程序之间的循环依赖关系。在这里使用信号毫无意义(当然,除非信号处理程序在另一个应用程序中,并且您不希望带有
酒店
货币
模型的应用程序依赖于另一个应用程序)

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

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

信号的要点是更好的解耦——允许其他应用程序(您不一定知道)透明地挂接到您的应用程序中,和/或避免应用程序之间的循环依赖关系。在这里使用信号毫无意义(当然,除非信号处理程序在另一个应用程序中,并且您不希望带有
酒店
货币
模型的应用程序依赖于另一个应用程序)

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

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

相当棘手的解决方案是在初始化时保存对象状态

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()))

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

相当棘手的解决方案是在初始化时保存对象状态

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()))

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

我认为您将在那里找到所需的一切:。您可以在重写init和save方法的同时使用它们,也可以重写setter!我想你会在那里找到你需要的一切。您可以在重写init和save方法的同时使用它们,也可以重写setter!可能重复的