Как найти наиболее эффективную категорию в 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)

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 продукта с таблицей продуктов. но у нас нет связи от таблицы продуктов к таблице категорий. (Таблица категорий содержит каждую категорию и их id). Для связи таблицы продуктов с таблицей категорий мы создали новую таблицу 'product_categories', которая связывает каждую категорию с соответствующим продуктом.

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

Имеет смысл добавить поле ManyToManyField для объединения моделей Products и Categories, используя Product_Categories в качестве сквозной таблицы

class Products(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=400 , blank=True)
    # Field added below
    categories = 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)

Эти отношения затем легко запрашивать, и в примере ниже мы аннотируем каждую категорию количеством связанных продуктов и упорядочиваем их по аннотации так, чтобы наиболее эффективные продукты шли первыми

from django.db.models import Count

Categories.objects.annotate(
    num_products=Count('products')
).order_by('-num_products')

Как насчет чего-то вроде:

from django.db.models import Count

category_with_the_most_products = Categories.objects.annotate(
    product_count = Count('product_categories_set')
).order_by(
    '-product_count'
).first()

Это создаст набор запросов из всех categories с количеством product_categories в качестве поля product_count. Затем он упорядочит их в порядке убывания. Наконец, он возьмет первый из списка, который будет category с наибольшим product_categories и, следовательно, наибольшим products.

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