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