Django QuerySets - 使用类方法

时间:2011-09-27 16:05:48

标签: django django-models

下面是一个精简模型和相关方法。我正在寻找一种简单的方法来执行查询,以便在单个答案中获取所有需要的信息,而无需重新查询所有内容。这里的挑战是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

由于

3 个答案:

答案 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实例。