2016-09-06 12 views
6

モデルフィールドの合計を返さなければならないいくつかのモデルで作業しています。モデルのsaveメソッドをオーバーライドするか、合計を返すカスタムメソッドを作成する方が良いでしょうか。いずれのソリューションでもパフォーマンス上の問題はありますか?Djangoモデル、保存メソッドまたはカスタムメソッドのオーバーライドプロパティ

オプション1:saveメソッドをオーバーライドします。

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を使用しようとしている途中に依存します。あなたはDBのフィールドとしてそれを保持する場合、あなたはそれにクエリを行うことができるだろう、そしてプロパティでそれは非常に扱いにくいでしょう。

一方、クエリを作成しない場合、このデータは貴重ではありません(言い換えれば、データ表現としてsum_integersが必要です) プロパティを使用する必要があります。

アプリケーションのパフォーマンスの点から: 何千ものオブジェクトに対して複雑な操作を行う場合は、列に値を格納するか、少なくとも2,300 。要約として

- DBの欄の合計の保存値は、より普遍的であり、任意の格下げはありませんが、いくつかのケースでpropertyアプローチは、あなたのデータモデルクリーナーを維持することができますし、あなたのディスク上のいくつかの領域を節約できます。

ご質問にお答えいただければ幸いです。不明な点がある場合は、お気軽にご質問ください。

+0

賛否両論のおかげで素敵な説明。 – Andreas

2

フィールドをさらに更新する必要があるか、合計をさらに呼び出す必要があるかによって異なります。

私は、より一般的なものにするために、演算は加算だけでなく、多数の複雑な計算を行うことを前提としています。

今は毎回合計を取得しなければならない場合は、モデルフィールドを作成して保存時に値を追加する方がよいでしょう。

ほとんどの場合、値を更新する必要がある場合は、通話中に値を取得する方法(2番目の方法)が適切です。

関連する問題