Вам нужно сделать десятичные значения перед их делением, просто умножьте на 1,0, чтобы убедиться в этом:
from django.db.models import ExpressionWrapper, Count, Value, DecimalField
Contract.objects.aggregate(perc=ExpressionWrapper(
Count('pk', filter=Q(verified_date__isnull=False)) * Value(1.0)
/ (Count('pk') * Value(1.0)),
output_field=DecimalField()))
Я использую ExpressionWrapper
, чтобы иметь возможность установить параметр output_field
на Само значение агрегации.
ОБНОВЛЕНИЕ: После рассмотрения этой проблемы на основе комментария о том, что приведение к output_field
должно работать, я Выяснилось, что это также работает:
from django.db.models import Count, DecimalField
from django.db.models.functions import Cast
Contract.objects.aggregate(perc=
Cast(
Count('pk', filter=Q(verified_date__isnull=False)),
DecimalField(max_digits=30, decimal_places=4)
)
/ Cast(
Count('pk'),
DecimalField(max_digits=30, decimal_places=4)
)
)
Упомянутая выше проблема объясняет, почему output_field
не работает. Кажется, что это будет в будущем: -)