Как подсчитать количество с помощью 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()

Но я не уверен, что это лучший метод для использования.

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