如何注释多个 django 模型

Posted

技术标签:

【中文标题】如何注释多个 django 模型【英文标题】:How to annotate over multiple django models 【发布时间】: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 的聚合中重用列有同样的问题。 【参考方案1】:

您可以使用RawSQL('any raw expression', ()) 作为解决方法。

【讨论】:

以上是关于如何注释多个 django 模型的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何聚合/注释多对多关系?

如何使用 StringAgg 或 ArrayAgg 连接多个子行中的一列来注释 django 查询集?

导致笛卡尔积的 Django 注释

如何在 Django 中过滤对象以进行计数注释?

prefetch_related 上的 Django ORM 注释

Django 在模型字段上注释 Avg