Найти список категорий, которые имеют наибольшее количество заказов в django
models.py
class Line_items(models.Model):
id = models.AutoField(primary_key=True)
product = models.ForeignKey('Products' , on_delete=models.DO_NOTHING )
class Products(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=400 , blank=True)
category = models.ManyToManyField('Categories', through='Product_Categories', related_name='products')
class Categories(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100 , blank=True)
slug = models.CharField(max_length=200 , blank=True)
class Product_Categories(models.Model):
id = models.AutoField(primary_key=True)
product_id = models.ForeignKey(Products, on_delete=models.DO_NOTHING)
category_id = models.ForeignKey(Categories, on_delete=models.DO_NOTHING)
<> Вот моя модель. где line_items содержит количество заказов, сделанных до сих пор. в line_items мы связали id продукта с таблицей продуктов. но у нас нет связи от таблицы продуктов к таблице категорий. (Таблица категорий содержит все категории и их идентификаторы).
Для связи таблицы продуктов с таблицей категорий мы создали новую таблицу 'product_categories', которая связывает каждую категорию с соответствующим продуктом.
здесь нам нужна категория с наилучшими показателями. категория, которая имеет наибольшее количество заказов. спасибо
Класс Product_Categories не имеет смысла. Вы можете удалить его. Один совет, называть свои модели во множественном числе - плохая практика. Было бы лучше "Категория", "Товар", ...
Если вы хотите узнать, сколько товаров находится в категории, просто сделайте следующее:
# ON VIEWS
category = Categories.objects.first() #The category you want to check
category.products.count() #Number of products included in this category
Если вы хотите показать список с категориями и товарами, включенными в ваш шаблон:
#ON VIEWS
context = {}
context['categories'] = Categories.objects.all()
#ON TEMPLATE
<ul>
{% for c in categories %}
<li>{{c.name}} - {{c.products.count}}</li>
{% endfor %}
</ul>
Если вам нужна верхняя. Категория с большим количеством товаров:
from django.db.models import Count
top_category = Categories.objects.annotate(q_count=Count('products')).order_by('-q_count').first()
РЕДАКТИРОВАНИЕ:
Я не нашел "простого способа" получить категорию с большим количеством заказов. Но вы можете попробовать следующее:
from operator import itemgetter
categories = Categories.objects.all()
category_orders = []
for c in categories:
x=0
for p in c.products.all():
x += p.line_items_set.count()
category_orders.append(c,x)
top_category = max(list,key=itemgetter(1))[0]
Вы можете охватывать отношения при использовании Count-метода в django.db.models.
cats = Category.objects.annotate(num=Count("products__line_items")).order_by("-num")
Результирующий набор запросов вернет вам категории, которые имеют наибольшее количество строк.
Вы, конечно, можете ограничить их, чтобы показывать только те категории, в которых есть заказы:
line_items_ids = [li.id for li in Line_items.objects.all()]
cats = (
Category.objects.filter(products__line_items__in=line_items_ids)
.annotate(num=Count("products__line_items"))
.order_by("-num")
)
Посмотрите Django Docs about aggregation для получения дополнительной документации.