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

时间:2017-12-21 15:27:07

标签: django database model

我试图谷歌解决这个简单案例的解决方案失败了:

有Book和Author模型。我可以有几本相同的书(有不同的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

1 个答案:

答案 0 :(得分:2)

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

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

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

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