関連する 2 つのモデルがあります。
class FirstModel(models.Model):
base_value = models.FloatField()
class SecondModel(models.Model):
parent = models.ForeignKey(FirstModel)
@property
def parent_value(self):
return self.parent.base_value
@property
def calculate(self):
return self.parent_value + 1
一般に、SecondModel.calculate
は主に関連する のコンテキストで使用されますFirstModel
。calculate
ただし、一時的な値を として呼び出すことができるようにしたい場合がありparent_value
ます。このようなもの:
foo = SecondModel()
# would look in the database for the related FirstModel and add 1 to its base_value
foo.calculate
foo.parent_value = 10
foo.calculate # should return 11
parent_value
は読み取り専用プロパティであるため、明らかにこれを行うことはできません。また、この種の機能が必要な SecondModel に似た多くの異なるモデルがあります。
私はいくつかのことを考えて試しましたが、どれもうまくいかないようです:
1) Django プロキシ モデルを作成する- 可能ですが、オブジェクトの数がかなり多いため、同様のコードをたくさん作成することになります。また、プロパティのオーバーライドに関連するバグがあるようです: https://code.djangoproject.com/ticket/16176。しかし、次のようになります。
class ModelProxy(SecondModel):
class Meta:
proxy = True
def __init__(self, temp_value):
self.parent_value = temp_value
2)インスタンスのプロパティをオーバーロードするparent_value
- 次のように:
foo = SecondModel()
setattr(foo, 'parent_value', 10)
ただし、プロパティはインスタンスではなくクラスのメンバーであるため、これを行うことはできません。そして、インスタンスに一時的な値を設定したいだけです
3)メタクラスまたはクラス ジェネレーター? - 複雑すぎるようです。また、メタクラスを使用して、models.Model の子であるクラスを動的に生成するとどうなるかはわかりません。データベース テーブルが同期していないと問題が発生しますか?
4)適切なゲッターとセッターでプロパティを書き換えますか? - プロパティを設定できるように SecondModel を書き直すのが解決策でしょうか?
助言がありますか?