Замена блока 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())