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

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