Django QuerySet: Почему я не могу отфильтровать аннотированный QuerySet? - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь получить список 100 самых популярных книг в моей базе данных, а затем создать список уникальных категорий, которые есть в этом списке.Вот мои упрощенные модели книг, избранных и категорий:

class Book(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category)

class Favorite(models.Model):
    user = models.ForeignKey(User)
    book = models.ForeignKey(Book)

class Category(models.Model):
    name = models.CharField(max_length=100)

Я легко могу получить список 100 самых популярных книг, используя следующий запрос:

books =  Book.objects.annotate(num_favorites=Count('favorite')).order_by('-num_favorites')[:100]

Но где яПроблемы начинаются, когда я пытаюсь получить список уникальных категорий для этих 100 самых популярных книг.Следующий запрос не работает (ошибка опубликована ниже), и я не могу понять, почему.

>>> categories = Category.objects.filter(book__in=books).distinct()
>>> categories


FieldError: Cannot resolve keyword 'num_favorites' into field. Choices are: category, favorite, id, name

Может кто-нибудь пролить свет на то, что мне здесь не хватает?

1 Ответ

3 голосов
/ 15 августа 2011

Возможно, вы складываете слишком много вещей в один запросПопробуйте разделить его:

book_ids = (Book.objects.annotate(num_favorites=Count('favorite'))
    .order_by('-num_favorites')[:100].values_list('id', flat=True))
categories = Category.objects.filter(book__in=book_ids).distinct()
...