Как подсчитать количество с помощью distinct?
У меня есть 2 шаблона, один представляет лист продукта, а другой - фактический продукт на складе. На складе может быть несколько продуктов, которые имеют одинаковый лист продукта. Пример: У меня может быть запись продукта "Бутылка воды", и несколько "бутылок воды" на складе.
Мои модели:
class Stock(models.Model):
machine = models.ForeignKey(
"machine.Machine",
verbose_name=_("machine"),
related_name="machine_stock",
on_delete=models.CASCADE
)
product = models.ForeignKey(
"client.Product",
verbose_name=_("product"),
related_name="product_stock",
on_delete=models.CASCADE
)
epc = models.CharField(_("EPC"), max_length=80)
dlc = models.DateField(_("DLC"))
class Product(models.Model):
name = models.CharField(_('Name'), max_length=255)
[...]
Я хочу получить продукты на складе, отсортированные как по DLC, так и по названию. На фронтенде я хочу отобразить таблицу с каждой строкой:
- название продукта
- the dlc
- количество продуктов с этим названием и этим dlc
Пример:
Если у меня есть 2 листа продукции (Модель продукции) :
- бутылка с водой
- бутылка кока-колы
и у меня есть 5 товаров на складе (Stock Model) :
- 2 бутылки воды, dlc которой 02/04/2022
- 2 бутылки колы, чей dlc - 02/04/2022
- 1 бутылка колы, чей dlc - 03/04/2022
Я хочу отобразить 3 строки в моей таблице:
Количество | Название | DLC
2 | вода | 02/04/2022
2 | cola | 02/04/2022
1 | cola | 03/04/2022
Я пробовал с
queryset = (
Stock.objects.all()
.select_related('product')
.select_related('machine')
.annotate(quantity=Count("product__name", distinct=True))
.distinct("dlc", "product__name",)
.order_by("-dlc")
)
Но django ORM не принимает annotate и distinct в одном запросе.
Это работает с:
queryset = (
Stock.objects.all()
.select_related('product')
.select_related('machine')
#.annotate(quantity=Count("product__name", distinct=True))
.distinct("dlc", "product__name",)
.order_by("-dlc")
)
for result in queryset:
result.quantity = Stock.objects.filter(dlc=result.dlc, product__name=result.product.name).count()
Но я не уверен, что это лучший метод для использования.