我有两个相关的模型:
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)用适当的 getter 和 setter 重写属性?- 也许解决方案是重写 SecondModel 以便可以设置属性?
有什么建议么?