【发布时间】:2020-01-05 10:55:06
【问题描述】:
我有一个模型,它对 m2m 字段上的一些值进行一些基本聚合。我可以通过在 Model 方法中进行计算来实现这一点,在这种情况下,结果将存储在模型属性中。
或者我可以在 pre_save 信号函数中进行计算,然后将结果存储在模型字段中。
我想知道使用信号有什么缺点吗?或者在哪些情况下使用模型属性方法会更好?
我知道计算会在不同的时间运行,调用 save() 时会运行信号函数,而模型方法会自动运行。
class CartItem(models.Model):
name = models.CharField(max_length=100)
total_price = models.DecimalField(max_digits=10, decimal_places=2)
##Model Method Approach
@property
def price(self):
return self.extras.all().aggregate(Sum('price'))['price__sum']
##Signal Approach
def set_total_price(sender, instance, **kwargs):
instance.total_price= instance.extras.all().aggregate(Sum('price'))['price__sum']
pre_save.connect(set_total_price, sender=CartItem)
信号方法的好处是产生一个模型字段而不是模型属性,这使得它更容易在父模型或相关模型中用于聚合。那么为什么要对模型信号使用模型方法呢?
【问题讨论】:
标签: python django django-models django-signals