mysql - Django 查询集 : Why can't I filter an annotated QuerySet?

标签 mysql django django-models django-queryset

我正在尝试检索数据库中 100 种最受欢迎​​的书籍的列表,然后创建该列表中的唯一类别的列表。以下是我简化的 Book、Favorite 和 Category 模型:

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

任何人都可以阐明我在这里缺少的内容吗?

最佳答案

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

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

关于mysql - Django 查询集 : Why can't I filter an annotated QuerySet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7061609/

相关文章:

python - 没有外键错误的django中间模型

Django rest 框架在serializer.py 或views.py 中编写复杂逻辑的位置?

django - 多对多字段的所有值:Django

sql - 引用 URL 中的对象 - 您使用主键还是最佳实践是什么?

python - 什么时候评估 Django QuerySet?

python - 我怎么会在 Django 中收到此无导入错误?

MySQL 格式化字符串或在 NULL 上返回空字符串

python - 复杂的 Django 查询,包括一对一模型

c# - 从内存加载 C# 中的数据 LOCAL INFILE

php - mysql 中的请求不发送任何数据,除了 phpmyadmin 中的请求