Как отсортировать набор запросов по количеству записей в другой таблице в 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 и затем упорядочивать его.