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,
    )
)

Документация по условным выражениям

Вернуться на верх