2013-07-27 4 views
2

У меня есть три таблицы с отношениями между;Объекты подсчета и упорядочения по нескольким отношениям

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; 

я увидел еще один вопрос here который я подозреваю, может быть решением моей проблемы, но я не могу иметь смысл ответа на работу на несколько отношений.

ответ

0

Это поможет вам линии макс заказа каждого клиента:

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] 
+0

Я извиняюсь за то, что неясно, отношения, к сожалению, не многие-ко-многим, но один-ко-многим, (то есть один клиент имеет много заказы, один заказ имеет много порядковых номеров). Это усложняет ситуацию? – Rayne

+1

@Rayne Реверс «ForeignKey» - это «Соответствующий менеджер», который работает почти точно так же, как «ManyRelatedManager», который вы получите для «ManyToManyField». Так что это обязательно должно работать, не усложняя ситуацию. @Neil Вы можете использовать '.order_by ('- max_order_lines')' вместо использования отсортированного dict и всего. Затем просто используйте 'custs.first()', чтобы получить первую строку. – knbk

+0

@knbk спасибо! Я отредактировал свой ответ на аккаунт для всех ваших комментариев. Rayne, это должно работать, пожалуйста, примите ответ, если это произойдет :) – Neil

Смежные вопросы