Агрегирование в свойстве модели приводит к дополнительным запросам

Мой пример:

class Product(models.Model):
    name = models.CharField(max_length=50)
    category = models.ManyToManyField("wms.ProductCategory", blank=True)

    @property
    def quantity_in(self):
        return self.intodocumentproduct_set.aggregate(total=Sum('quantity_in', default=0))['total']

class IntoDocumentProduct(models.Model):
    product = models.ForeignKey("wms.Product", on_delete=models.CASCADE)
    quantity_in = models.FloatField(blank=True, null=True)


class ProductListAPIView(ListAPIView):
    # queryset = Product.objects.prefetch_related('category').annotate(sum_quantity_in=Sum('intodocumentproduct__quantity_in', default=0)).all()
    queryset = Product.objects.prefetch_related('category').all()
    serializer_class = ProductModelSerializer

Комментированный набор запросов приводит к 4 запросам, в то время как другой запрос (использующий свойство) приводит к 6 запросам. Вероятно, проблема n+.

enter image description here enter image description here

Мне нужно использовать такие свойства, как: quantity_ordered, количество_зарезервировано, quantity_out, количество_в, quantity_stock, quantity_available, количество_отложенного_отпуска и многое другое во многих местах веб-приложения. Вычисление их в каждом представлении займет много времени и приведет к ошибкам.

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

Есть ли другое решение для удаления лишних запросов?

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