下面是一个精简模型和相关方法。我正在寻找一种简单的方法来执行查询,以便在单个答案中获取所有需要的信息,而无需重新查询所有内容。这里的挑战是value
取决于value_id的签名。
class Property(models.Model):
property_definition = models.ForeignKey(PropertyDefinition)
owner = models.IntegerField()
value_id = models.IntegerField()
def get_value(self):
if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id)
else: return PropertyShort.objects.get(id=self.value_id)
现在要获得“价值”,我需要这样做:
object = Property.objects.get(property_definition__name="foo")
print object.get_value()
有人可以提供更清洁的方法来解决这个问题,还是“足够好”?理想情况下,我只想这样做。
object = Property.objects.get(property_definition__name="foo")
object.value
由于
答案 0 :(得分:1)
这是一个糟糕的设计。正如Daniel Roseman所说,如果必须从同一领域引用两个不同的模型,请查看通用外键。
https://docs.djangoproject.com/en/1.3/ref/contrib/contenttypes/#generic-relations
答案 1 :(得分:1)
鉴于这是一个糟糕的设计。您可以使用内置property装饰器为您的方法充当属性。
class Property(models.Model):
property_definition = models.ForeignKey(PropertyDefinition)
owner = models.IntegerField()
value_id = models.IntegerField()
@property
def value(self):
if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id)
else: return PropertyShort.objects.get(id=self.value_id)
这将使您能够做您理想的事情:Property.objects.get(pk=1).value
但我会尽量称之为“清洁”。 ; - )
您可以通过扩展django.models.Field
来进一步编写自己的custom model field,以隐藏API背后的架构中的肮脏。这至少可以为您提供您现在想要的API,因此您可以稍后将该恶意迁移出去。
其他人提到的那个或通用密钥。选择你的毒药......
答案 2 :(得分:0)
Model inheritance,因为value不是Field实例。