[英]Django - Model property methods vs signals for field calculation
我有一個模型可以對 m2m 字段上的某些值進行一些基本聚合。 我可以通過在模型方法中進行計算來實現這一點,在這種情況下,結果將存儲在模型屬性中。
或者我可以在 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)
信號方法的好處是產生模型字段而不是模型屬性,這使得它更容易在父模型或相關模型中用於聚合。 那么為什么要在模型信號上使用模型方法呢?
不同之處在於每次訪問時都會計算@property
,並且將計算一次信號然后存儲,如果您沒有使用正確的索引,它們可能會對性能產生很大的影響
另一個區別是,如果您使用CartItem.objects.update
,信號將不會運行,因此您最終會得到無效數據,如果您直接通過 SQL 在 Django 之外更新對象,則同樣如此。
我對 Django 很陌生,但我問了一個類似的問題。 我有 2 個時間字段,需要它們之間的差異。 我的第一次嘗試是使用一個運行良好的屬性,直到我意識到我需要能夠輕松地獲得整個查詢集的總差異。
我最終實現了一個 pre_save 信號來設置字段的值。 在我的用例中,數據不會經常更改,所以這是有道理的。 然后我在查詢集上創建了一個屬性來聚合總和。 這樣我就可以先過濾並得到子集的總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.