Django 多关系上实体的计数和排序

Django 多关系上实体的计数和排序,django,django-orm,Django,Django Orm,我有三张表,它们之间有关系 Customer --> Order --> OrderLine 我想知道哪些客户下的订单最多。使用纯SQL,我将继续使用以下查询 SELECT a.*, COUNT( c.id ) AS total FROM customer AS a LEFT JOIN order AS b ON a.id = b.customer_id LEFT JOIN order_line AS c ON b.id = c.order_id GROUP BY a.id

我有三张表,它们之间有关系

Customer --> Order --> OrderLine
我想知道哪些客户下的订单最多。使用纯SQL,我将继续使用以下查询

SELECT a.*, COUNT( c.id ) AS total FROM customer AS a
 LEFT JOIN order AS b ON a.id = b.customer_id
 LEFT JOIN order_line AS c ON b.id = c.order_id
 GROUP BY a.id ORDER BY total DESC;

我看到了另一个问题,我怀疑这可能是我问题的解决方案,但我无法真正理解处理多个关系的答案。

这将为您提供每个客户的最大订单行数:

from django.db.models import Max
custs = Customer.objects.annotate(max_order_lines=Max(order__orderline)).values('id', 'max_order_lines').order_by('-max_order_lines')
max_cust = custs[0]

很抱歉我不清楚,很遗憾,这种关系不是多对多而是一对多(即一个客户有多个订单,一个订单有多个订单行)。这会使事情复杂化吗?@Rayne,ForeignKey的反面是
RelatedManager
,它的工作原理几乎与
ManyRelatedManager
的工作原理完全相同。因此,它肯定可以在不使事情复杂化的情况下工作@Neil您可以使用
.order\u by('-max\u order\u line')
而不是使用排序的dict和所有内容。然后只需使用
custs.first()
获取第一行。@knbk谢谢!我已经编辑了我的回复,以解释您的所有评论。Rayne,这应该可以,如果可以,请接受答案:)@Neil刚刚尝试在我自己的项目中使用
.first()
方法,然后注意到在我们获得Django 1.6之前它将不可用。我们现在必须坚持使用
[0]
。@knbk谢谢,我已经把它改回来了。我以前没见过
first()
,但很高兴知道:)