Как отсортировать набор запросов по количеству записей в другой таблице в Django

У меня есть таблица Product и таблица Order. таблица Product записывает информацию о продукте, а таблица Order записывает записи о покупках клиента

Теперь я хочу получить набор запросов продуктов и отсортировать их по магазину с наибольшим количеством покупок в истории заказов клиента

Модель продукта

id product_name store_id store_name price .....
1 iPhone 14 1 Amazon 100 .....
2 iPhone 14 2 Shopee 1 .....
3 iPhone 12 3 Taobao 100 .....
4 iPhone 13 1 Amazon 80 .....
5 iPhone 14 3 Taobao 100 .....

Модель заказа

id product_id customer_id customer_name
1 1 1 Mike
2 2 1 Mike
3 4 1 Mike
4 1 2 Jhon
5 3 3 Simon

В моем случае, я хочу получить набор запросов продукта и отсортировать по магазину с наибольшим количеством покупок в истории заказов клиента

Например:

когда id_клиента равен 1 (Майк), набор запросов продуктов должен быть следующим, потому что Майк провел больше всего времени на Amazon, поэтому при упорядочивании продуктов на первом месте должны быть продукты Amazon

id product_name store_id store_name price .....
1 iPhone 14 1 Amazon 100 .....
4 iPhone 13 1 Amazon 80 .....
2 iPhone 14 2 Shopee 1 .....
3 iPhone 12 3 Taobao 100 .....
5 iPhone 14 3 Taobao 100 .....

В том же случае, когда идентификатор клиента равен 3 (Саймон), набор запросов продуктов должен быть следующим, потому что Майк провел больше всего времени на Taobao

id product_name store_id store_name price .....
3 iPhone 12 3 Taobao 100 .....
5 iPhone 14 3 Taobao 100 .....
1 iPhone 14 1 Amazon 100 .....
2 iPhone 14 2 Shopee 1 .....
4 iPhone 13 1 Amazon 80 .....

Я использую подсчет и фильтр в Django, код ниже, но он выполняет результат неправильно customer_id = 1 # Mike

product_set = Product.objects.annotate(count=Count('order__store_id', filter=Q(order__customer_id=customer_id, order__store__id=F('store_id')))).order_by('-count')

Я думаю, что вы хотите сказать, что если яблоко - это товар и магазин 1 продал его 15 раз магазин 2 продал его 25 раз

на первое место выходит товар apple с идентификатором магазина 1

для этого:

from django.db.models import Count
Product.objects.annotate(store_count=Count('store_id')).order_by('-store_count')

или

queryset.objects.annotate(store_count=Count('store_id')).order_by('-store_count')

это создаст временное поле store_count и Count('store_id') будет подсчитывать вхождения товара с store_id и затем упорядочивать его.

Вернуться на верх