2009-11-09 61 views
0

由於改編自http://www.djangoproject.com/documentation/models/generic_relations/Django的 - 過濾上通用的相關對象

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) 



如果VegetableMineralis_edible的方法呢?

+0

這是你正在使用的Django標籤? – 2009-11-09 22:51:34

+0

不。我的實際問題不涉及標籤。這只是我發現的第一個通用關係示例。 – 2009-11-09 23:05:22

回答

1

你不能用普通關係來做到這一點,因爲沒有什麼可以保證目標模型甚至會有一個edible字段。

另一種方法是將結構更改爲使用模型繼承(多表)。蔬菜和礦物質都將繼承Taggable模型,其中包含edible字段(或其他您需要過濾的字段)。然後TaggedItem將有一個標準的ForeignKeyTaggable,所以你會使用標準的雙下劃線過濾器語法。