鉴于以下模型改编自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)
如果Vegetable
和Mineral
使用is_edible
方法会怎样?
答案 0 :(得分:1)
你不能用泛型关系真正做到这一点,因为没有什么可以保证目标模型甚至会有一个edible
字段。
另一种方法是更改结构以使用模型继承(多表)。蔬菜和矿物都将继承自Taggable
模型,该模型包含edible
字段(或您需要过滤的任何其他内容)。然后TaggedItem
会有一个标准ForeignKey
到Taggable
,因此您将使用标准的双下划线过滤器语法。