簡體   English   中英

Django - 用於字段計算的模型屬性方法與信號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM