通过两个关系注释Django查询集
我有代表人物和书籍的模型,这些模型通过一个可指示其角色的直通模型连接(例如“作者”或“编辑”): 我有一个阅读模型,它代表了一本书被阅读的场景:通过两个关系注释Django查询集,django,django-queryset,Django,Django Queryset,我有代表人物和书籍的模型,这些模型通过一个可指示其角色的直通模型连接(例如“作者”或“编辑”): 我有一个阅读模型,它代表了一本书被阅读的场景: class Reading(models.Model): book = models.ForeignKey('Book') start_date = models.DateField() end_date = models.DateField() 我知道如何根据与他们相关联的数量书籍获取订购的人的列表: from djang
class Reading(models.Model):
book = models.ForeignKey('Book')
start_date = models.DateField()
end_date = models.DateField()
我知道如何根据与他们相关联的数量书籍
获取订购的人的列表:
from django.db.models import Count
from .models import Person
Person.objects.annotate(num_books=Count('books')) \
.order_by('-num_books')
但是,我如何才能获得一份按其书籍
阅读次数排序的人
列表(即与其书籍
相关的阅读次数)?您可以使用标准的django双下划线符号:
Person.objects.annotate(num_readings=Count('books__reading')) \
.order_by('-num_readings')
有关更多信息,请参阅上的文档。您可以使用标准的django双下划线符号:
Person.objects.annotate(num_readings=Count('books__reading')) \
.order_by('-num_readings')
有关更多信息,请参阅上的文档。Doh,当然!我一直在仔细考虑这个问题,研究子查询之类的问题。谢谢@Alasdair帮我纠正错误。@AntoinePinsard我记不得了。菲尔会告诉我们的。是的,我也是。哈哈。这就是为什么我总是使用显式的related\u name
。。。获取读数查询集的方法是book.reading\u set.all()
,但是Count('books\u reading')
适用于注释。@PhilGyford是的,在这种情况下不需要子查询。如果您想限制要计算阅读次数的书籍(例如,仅计算genre='summary'
书籍的阅读次数),那么它会变得更加棘手。当然,Doh!我一直在仔细考虑这个问题,研究子查询之类的问题。谢谢@Alasdair帮我纠正错误。@AntoinePinsard我记不得了。菲尔会告诉我们的。是的,我也是。哈哈。这就是为什么我总是使用显式的related\u name
。。。获取读数查询集的方法是book.reading\u set.all()
,但是Count('books\u reading')
适用于注释。@PhilGyford是的,在这种情况下不需要子查询。如果您想限制要计算阅读次数的书籍(例如,仅计算带有genre='summary'
的书籍的阅读次数),则会变得更加棘手。