Менеджер не доступен через экземпляры `Model` - PullRequest
4 голосов
/ 05 апреля 2011

У меня есть модель полиморфных тегов, и я хочу создать для нее tag_cloud, но когда я хочу посчитать связанный объект с тегами

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 ]

5 голосов
/ 05 апреля 2011

Вы пытаетесь получить доступ к менеджеру из экземпляра модели, что невозможно. Больше информации: Получение объектов (особенно примечание).

 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 голосов
/ 15 апреля 2011

Ошибка была выдана в первую очередь, потому что если я хочу получить доступ к 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()
4 голосов
/ 05 апреля 2011

Не было бы проще / чище просто добавить метод подсчета в 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()
...