2016-09-06 122 views
6

我正在使用一些模型,它必須返回一個模型字段的總和。重寫模型上的save方法還是創建一個返回總和的自定義方法會更好一些。任何解決方案是否存在性能問題?Django模型,覆蓋保存方法或屬性的自定義方法

選項1:覆蓋保存方法。

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    sum_integers = models.IntegerField() 

    def save(self, *args, **kwargs): 
     self.sum_integers = sum(
      [self.integer1, self.integer2, self.integer3]) 
     self.sum_integers.save() 
     return super(SomeModel, self).save(*args, **kwargs) 

選項2:自定義方法

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    @property 
    def sum_integers(self): 
     return sum([self.integer1, self.integer2, self.integer3]) 

回答

2

答案取決於你要使用sum_integers的方式。如果你把它作爲一個字段保存在數據庫中,你將能夠對它進行查詢,並且對於屬性它會非常棘手。

另一方面,如果您不打算進行查詢,而且這些數據對您無用(換句話說 - 您需要sum_integers作爲數據表示形式) 那麼您應該使用屬性。

從應用性能的角度: 如果你要做出成千上萬個對象的複雜操作 - 這可能是更好的存儲在列或至少改變屬性cached_property值如果叫了幾聲。

作爲一個總結 - 在數據庫列中存儲總和的價值更普遍,並沒有任何降級,但在某些情況下,property方法可以讓您的數據模型更清潔並在磁盤上節省一些空間。

我希望這是你的問題的答案。如果有不清楚的地方,請隨意填寫以詢問問題。

+0

謝謝,很好的解釋利弊。 – Andreas

2

取決於您是否需要更新字段或更多地調用總數。

爲了使它更通用,我假設操作不僅是加法,而且涉及大數量的多個複雜計算。

如果您必須時不時地獲得總和,那麼最好創建一個模型字段並在保存時添加值。

如果您不得不更新它,那麼通常獲取調用值(第二種方法)更適合。