Django で Model クラスのオブジェクト生成時に導出項目を設定させる。

単にコンストラクタを呼び、変数をセットするだけです。下のサンプルコードでは、季節性の価格(季節に依って変動する価格) seasonal_value を持つ Product モデルについて記載しています。

サンプルコード

class Product(models.Model):
  original_price = models.IntegerField(default=100)
  price = None
  
  def get_seasonal_price():
    ...
    return seasonal_price

  def set_derivable_items(self):
    self.price = self.get_seasonal_price()
    # 英語で導出項目ってなんて言うんだろう...。

  # def __init__(self) だと、親クラスの __init__ が呼べなくなるよ。
  def __init__(self, *args, **kwargs):
    self.set_derivable_items(self)
    # 親クラスの __init__ を呼びます。
    models.Model.__init__(self, *args, **kwargs)

 


__init__ のなかで set_derivable_items 呼び出さない
filter したり get したあとに、その都度、set_derivable_items を呼び出すのは、やはり不自然なので、__init__ で呼ぶことにしました。
 

全部、非正規化、フィールドで値を保存する
第1正規化すること => 何が導出項目なのかを明確にしておくこと => 手動で更新しないといけない値を明確にすることは、大事だと思うので、そうしました。