Агрегирование в свойстве модели приводит к дополнительным запросам
Мой пример:
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+.
Мне нужно использовать такие свойства, как: quantity_ordered, количество_зарезервировано, quantity_out, количество_в, quantity_stock, quantity_available, количество_отложенного_отпуска и многое другое во многих местах веб-приложения. Вычисление их в каждом представлении займет много времени и приведет к ошибкам.
Это решение не очень удобно, когда свойство используется во многих представлениях с большим количеством свойств.
Есть ли другое решение для удаления лишних запросов?