我试图谷歌解决这个简单案例的解决方案失败了:
有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
答案 0 :(得分:2)
select_related
这里是一个红鲱鱼;访问相关模型的元素需要永远,它所做的就是提高效率。
与所有其他类型的查询一样,要访问相关元素,您只需使用双下划线语法。假设您的作者模型具有name
字段:
Book.objects.values("book_name","author__name").annotate(count=Count("book_name")
注意,我发现很难理解你的查询是什么;书名的数量应该是多少?我怀疑你真正想要的是一个作者姓名列表和他们的书籍计数,在这种情况下你应该从作者而不是书开始。)