Деление агрегированных выражений (Count / Count) приводит к зоро, независимо от того, что

Вот фрагмент кода проблемы


#multiplication works fine
drivers.annotate(
            completed_orders_percentage=( Count('orders', filter=Q(orders__rejected=False), distinct=True) * Count('orders', distinct=True) ) * 100 ,
        )

#addition works fine
drivers.annotate(
            completed_orders_percentage=( Count('orders', filter=Q(orders__rejected=False), distinct=True) + Count('orders', distinct=True) ) * 100 ,
        )

#subtraction works fine
drivers.annotate(
            completed_orders_percentage=( Count('orders', filter=Q(orders__rejected=False), distinct=True) -  Count('orders', distinct=True) ) * 100 ,
        )

#diving not working (returns 0)
drivers.annotate(
            completed_orders_percentage=( Count('orders', filter=Q(orders__rejected=False), distinct=True) / Count('orders', distinct=True) ) * 100 ,
        )

я не смог найти ничего полезного в документации, я подумал, что это может быть связано с типом возврата, поэтому я попытался обернуть его в ExeprisionWrapper с output_field=FloatField(), но все равно то же самое!

Вы выполняете бесконечное деление, поэтому результат будет усечен до нуля.

Вы можете перенести умножение на передний план, что позволит избежать такой ошибки округления:

drivers.annotate(
    completed_orders_percentage=100
    * Count('orders', filter=Q(orders__rejected=False), distinct=True)
    / Count('orders', distinct=True),
)
Вернуться на верх