【问题标题】:Detect field change in Django model检测 Django 模型中的字段变化
【发布时间】:2017-12-08 17:55:55
【问题描述】:

是否可以检测到 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. 覆盖 save 方法并创建一个新属性 __my_current_price 就像 here - 这可行,但它使代码对我来说非常不清楚。

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

【问题讨论】:

  • 是的,post_save使用信号,当current_price根据它改变时,其他2个字段将被计算并保存
  • 我怎样才能检测到 current_price 已更改?
  • @Exprator 哦,是的,你是说这个答案吗? stackoverflow.com/a/7934958/3371056好像不错。
  • 是的,这就是我所说的信号:)
  • 虽然这是一个好方法,但我正在考虑使用 pre_save - 可能吗?使用 pre_save,将只有一次提交。我不确定我是否可以访问未在预保存中提交更改的对象。

标签: python django django-models


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多