2011-04-05 50 views
4

我有多态性标记模型是无法访问的,我想创建tag_cloud它, 但是当我想指望相关对象标签经理通过`Model`实例

tags = TaggedItem.objects.all() 
# Calculate tag, min and max counts. 
min_count = max_count = tags[0].object.objects.count() 

我得到:

Manager isn't accessible via Artcle instances 

tagging.models.py

class Tag(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True, max_length=100) 
    #..... 

class TaggedItem(models.Model): 
    tag = models.ForeignKey(Tag) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object = generic.GenericForeignKey('content_type', 'object_id') 
    #..... 

回答

3

的错误是在第一次发放到位,因为如果我想获得tags计数他们在这种情况下,我宁愿改变

tags = TaggedItem.objects.all() 
# Calculate tag's min and max counts. 
min_count = max_count = tags[0].object.objects.count() 

到:

tags = Tag.objects.all() 
# Calculate tag, min and max counts. 
min_count = max_count = tags[0].taggeditem_set.count() 
5

你正试图从模型访问管理器这是不可能的。更多信息:Retrieving objects(特别说明)。

tags[0].object.objects.count() \/ 
     ¨¨¨¨¨¨     /\ 

,而你可以这样做(未测试):

object_klass = tags[0].object.__class__ 
min_count = max_count = object_klass.objects.filter(pk=tags[0].object.pk).count() 
4

这岂不是更容易/清洁剂只需添加一个计数方法TaggedItem。可能像下面的东西。我有点生疏这段代码可能无法工作。

class TaggedItem(models.Model): 
    tag = models.ForeignKey(Tag) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object = generic.GenericForeignKey('content_type', 'object_id') 

    def get_object_count(): 
     return self.object__count #or return self.object.count()