Деление агрегированных выражений (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),
)