Django - 过滤通用相关对象

时间:2009-11-09 22:47:15

标签: django generics filter

鉴于以下模型改编自http://www.djangoproject.com/documentation/models/generic_relations/

class TaggedItem(models.Model):
    """A tag on an item."""
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

class Vegetable(models.Model):
    name = models.CharField(max_length=150)
    is_yucky = models.BooleanField(default=True)
    edible = models.BooleanField(default=True)

class Mineral(models.Model):
    name = models.CharField(max_length=150)
    hardness = models.PositiveSmallIntegerField()
    edible = models.BooleanField(default=True)

我如何过滤TaggedItems以便我只获得那些可食用的content_objects?

理想情况下,如:

TaggedItem.objects.filter(content_object.edible=True)



如果VegetableMineral使用is_edible方法会怎样?

1 个答案:

答案 0 :(得分:1)

你不能用泛型关系真正做到这一点,因为没有什么可以保证目标模型甚至会有一个edible字段。

另一种方法是更改​​结构以使用模型继承(多表)。蔬菜和矿物都将继承自Taggable模型,该模型包含edible字段(或您需要过滤的任何其他内容)。然后TaggedItem会有一个标准ForeignKeyTaggable,因此您将使用标准的双下划线过滤器语法。