Как найти доступное количество товаров 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
    }
Вернуться на верх