【发布时间】:2014-11-13 01:21:14
【问题描述】:
我有以下 Django 模型:
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
class Meta:
db_table = "books"
class BookCategory(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
class Meta:
db_table = "bookcategories"
class BookCategoryMembership(models.Model):
id = models.AutoField(primary_key=True)
category = models.ForeignKey(BookCategory)
book = models.ForeignKey(Book)
class Meta:
db_table = "bookcategories_books"
class UserBook(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)
book = models.ForeignKey(Book)
class Meta:
db_table = "user_book"
UserBook 模型用于表示用户是否拥有一本书。
现在,我想返回所有图书类别的列表,按拥有最多的图书数量排序(即最热门的类别应该首先出现)。
我尝试使用 Django ORM 注释,但没有让它工作。
这是不起作用的子查询:
BookCategoryMembership.objects.annotate(num_books=Count("book__userbook")).
values('category_id').annotate(Sum('num_books'))
(导致错误信息
FieldError: Cannot compute Sum('num_books'): 'num_books is an aggregate"
我知道从这个子查询中,order_by 子句仍然缺失,但我假设我必须先让子查询工作。
你知道我可以用哪个查询在 django 中解决这个问题吗?我想避免将其拆分为多个查询或在 django 中进行任何计算。
【问题讨论】:
-
在一个 QuerySet 的聚合中重用列有同样的问题。
标签: python mysql django django-queryset django-orm