Замена блока IF на классы условных выражений в запросе к базе данных через Django ORM

В качестве ответа на JSON запрос необходимо вывести сумму транзакций(расходов и доходов) пользователя. Если пользователь еще не добавил транзакции, должен вернуться 0.

Текущий код:

views.py

@action(methods=['get'], detail=False)
    def get_transaction_amount(self, request):
        sum_all_transactions = Transactions.objects.filter(owner=self.request.user).aggregate(
            sum_income=Sum('amount', filter=Q(category__type=1)),
            sum_expenses=Sum('amount', filter=Q(category__type=0)))

                if sum_all_transactions['sum_income'] and sum_all_transactions['sum_expenses']:
            return Response([sum_all_transactions])

        elif sum_all_transactions['sum_income']:
            return Response([{
                'sum_income':sum_all_transactions['sum_income'],
                'sum_expenses':0
            }])

        elif sum_all_transactions['sum_expenses']:
            return Response([{
                'sum_expenses':sum_all_transactions['sum_expenses'],
                'sum_income':0
            }])
        else:
            return Response([{
                "sum_income": 0,
                "sum_expenses": 0
            }])

model.py

class Category(models.Model):
    TYPE_CHOICES = (
        (0, 'Расход'),
        (1, 'Доход'),
    )

    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES)
    name = models.CharField(verbose_name='Название категории', max_length=50)
    owner = models.ForeignKey(User, verbose_name='Владелец', on_delete=models.CASCADE)



class Transactions(models.Model):
    owner = models.ForeignKey(User, verbose_name='Владелец', on_delete=models.CASCADE)
    category = models.ForeignKey('Category', verbose_name='Категории', on_delete=models.CASCADE)
    amount = models.DecimalField(verbose_name='Сумма транзакции', max_digits=10, decimal_places=2)
    date_operation = models.DateField(verbose_name='Дата транзакции')

Можно ли перенести блок If в функции get_transaction_amount в запрос к БД (sum_all_transactions) с использованием Case и When или других инструментов ?

Исправил с помощью Coalesce. Вот код:

sum_all_transactions = Transactions.objects.filter(owner=self.request.user).aggregate(
            sum_income=Coalesce(Sum('amount', filter=Q(category__type=1)),0, output_field=DecimalField()),
            sum_expenses=Coalesce(Sum('amount', filter=Q(category__type=0)), 0, output_field=DecimalField())
Вернуться на верх