无法通过`Model`实例访问Manager

4 投票
3 回答
6581 浏览
提问于 2025-04-16 15:06

我有一个多态标签模型,我想为它创建一个标签云,但当我想计算与标签相关的对象时,

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 个回答

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()
5

你正在尝试从一个模型实例中访问管理器,这是不可能的。更多信息请查看:获取对象(特别是关于Note的部分)。

 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

最开始出现错误是因为,如果我想要访问 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()

撰写回答