Django QuerySet:为什么我不能过滤带注释的QuerySet?

时间:2011-08-15 04:01:11

标签: mysql django django-models django-queryset

我正在尝试检索数据库中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 个答案:

答案 0 :(得分:3)

您可能会在一个查询中堆积太多内容。尝试拆分它:

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