Django查询带注释并选择相关的一起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django查询带注释并选择相关的一起相关的知识,希望对你有一定的参考价值。

我试图谷歌解决这个简单的案例是不成功的:

有书和作者模型。我可以有几本相同的书(有不同的ID)。作者是Book中的外键。

我需要简单的方法来列出所有书籍,他们的计数和作者姓名。

我可以:

Book.objects.values("book_name","author").annotate(count=Count("book_name")

这给了我一个数组,其中aditional值与“book_name”项的计数。但它不是作者名称,而只返回作者对象id。

我可以使用作者姓名

Book.objects.select_related()

这取代了作者的ID与相关对象,所以我可以得到author.name,但它不适用于.values()

知道如何让这个合作吗?所以我可以同时计算每本书和作者姓名?

我想避免复杂的解决方案,比如查询Books,以及结果数组的循环结构和查询每本书的作者名称。

非常感谢。 TC

答案

select_related在这里是一个红鲱鱼;它永远不需要访问相关模型的元素,它所做的就是提高效率。

与所有其他类型的查询一样,要访问相关元素,您只需使用双下划线语法。假设您的作者模型有一个name字段:

Book.objects.values("book_name","author__name").annotate(count=Count("book_name")

注意,我发现很难理解你的查询是什么;书名的数量应该是多少?我怀疑你真正想要的是一个作者姓名列表和他们的书籍计数,在这种情况下你应该从作者而不是书开始。)

以上是关于Django查询带注释并选择相关的一起的主要内容,如果未能解决你的问题,请参考以下文章

Django 在不知道文件名的情况下显示带注释的查询集的值

在 Django 中使用带注释的查询集运行总计

如何从我的带注释的 Django 查询中过滤/排除非活动评论?

Django 查询 - 在带注释的计数过滤器中获取父对象

如何在带注释的 Django 查询集结果上列出字段值?

Django ORM distinct 查询,其中订单由带注释的字段完成,您需要 distinct('id')