Как найти доступное количество товаров Django ORM
Неточные результаты при использовании Django ORM для подсчета доступного количества товаров.
Я столкнулся с проблемой поиска доступного количества товаров с помощью Django ORM. Я написал код, который использует ORM для аннотирования набора запросов с полями количества произведенного, количества проданного и доступного количества, но результаты неточны. Однако, когда я использую необработанный SQL для выполнения тех же вычислений, результаты получаются точными. Мне нужна помощь в понимании того, почему код ORM работает не так, как ожидалось, и как это исправить.
Код Django ORM для поиска количества товаров:
def get_queryset(self):
queryset = super().get_queryset()
queryset = queryset.annotate(Quantity_Produced=Sum(F('production__qunatity_produced')))
queryset = queryset.annotate(Quantity_Sold=Sum(F('sales__qunatity_delivered')))
queryset = queryset.annotate(Quantity_available=Sum(F('production__qunatity_produced'))
- Sum(F('sales__qunatity_delivered')))
return queryset
Вывод (неточный):
{
"product_id": 1,
"product_name": "Product 1",
"weight": 10.0,
"Quantity_Produced": 6300.0,
"Quantity_Sold": 2600.0,
"Quantity_available": 3700.0
}
Сырой SQL-метод для нахождения доступного количества продуктов:
def get_queryset(self):
queryset= models.Products.objects.raw('''
SELECT
*,
(SELECT SUM(q.qunatity_produced) FROM production q WHERE q.product_id = p.product_id) AS Quantity_Produced ,
(SELECT SUM(s.qunatity_delivered) FROM Sales s WHERE s.product_id = p.product_id) AS Quantity_Sold,
sum((SELECT SUM(q.qunatity_produced) FROM production q WHERE q.product_id = p.product_id)
-(SELECT SUM(s.qunatity_delivered) FROM Sales s WHERE s.product_id = p.product_id))as Quantity_available
FROM
products p
group by Product_id
order by Product_id
''')
return queryset
Выход (точный):
{
"product_id": 1,
"product_name": "Product 1",
"weight": 10.0,
"Quantity_Produced": 700.0,
"Quantity_Sold": 260.0,
"Quantity_available": 440.0
}