通过两个关系注释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'
的书籍的阅读次数),则会变得更加棘手。