Django условная аннотация с использованием переменной python
Пытаюсь найти способ использовать аннотацию в зависимости от проверки состояния переменной python.
Пример:
some_variable = 10000,50 #float
expenses_by_categories = (
Category.objects.filter(transactions__operation="expenses")
.annotate(
expenses_sum=Sum('transactions__value', filter=Q(
transactions__date_created__month=datetime.date.today().month) & Q(
transactions__date_created__year=datetime.date.today().year)),
)
.annotate(
percentage=Round(
ExpressionWrapper(
F('expenses_sum') / some_variable * 100, output_field=FloatField()
), 2))
.order_by('-percentage')
)
Работает до тех пор, пока some_variable
больше 0, иначе zero devision exception
поднимается.
Есть ли способ выполнить некоторые проверки внутри аннотации с такой логикой:
if some_variable > 0:
percentage = F('expenses_sum') / some_variable * 100
else:
percentage = 0
Вы можете использовать Case
вместе с When
, чтобы избежать исключения деления на ноль в аннотации.
from django.db.models import Case, When
queryset.annotate(
percentage=Round(
Case(
When(some_variable=0, then=0),
default=ExpressionWrapper(F('expenses_sum') / some_variable * 100, output_field=FloatField()),
),
2,
)
)