检测Django模型中的字段更改

时间:2017-07-05 07:39:20

标签: python django django-models

是否有可能检测到Django模型中的字段已被更改?

class Product(models.Model):
    my_current_price = MoneyField(max_digits=20, decimal_places=2, null=True, blank=True,
                                  verbose_name=_('My original price'))
    my_eur_price = MoneyField(max_digits=20, decimal_places=2, null=True, blank=True, verbose_name=_('My price in EUR'))
    my_usd_price = MoneyField(max_digits=20, decimal_places=2, null=True, blank=True, verbose_name=_('My price in USD'))

问题是我需要在my_current_price更改时随时重新计算欧元和美元价格。

我有两个想法:

  
      
  1. 以某种方式覆盖MoneyField并在字段更改时发送信号。

  2.   
  3. 覆盖保存方法并创建一个新属性__my_current_price,如here - 这样可行,但它使代码对我来说非常不清楚。

  4.   

修改 由于数据库查找速度更快,我以不同的货币存储价格。

1 个答案:

答案 0 :(得分:1)

一种方法是创建一个信号并将instance与数据库中的对象进行比较。但似乎更好的方法是覆盖save方法,这是一种最佳实践。

def save(self,*args,**kwargs):
    old = Model.objects.filter(pk=getattr(self,pk,None)).first()
    if old:
        if old.attr!=self.attr:
            # attr changed
    super(Model,self).save(*args,**kwargs)