2011-04-05 49 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()