Django — ноль агрегации

#django #django-queryset

#django #django-набор запросов

Вопрос:

У меня есть следующее в моем views.py :

 called = CashFlow.objects.filter(item__slug=itemslug).filter(type='cashin').aggregate(sum=Sum('amount'))['sum']

distributed = CashFlow.objects.filter(item__slug=itemslug).filter(type='cashout').aggregate(sum=Sum('amount'))['sum']

try:
   result = round(-distributed/called * 100,2)
except ZeroDivisionError :
   result = 0
  

Все работает нормально до тех пор, пока один из запросов что-то возвращает. но, допустим, пока не было никаких выплат -> результат должен быть нулевым. Тем не менее, я получаю следующую ошибку типа: «неправильный тип операнда для унарного -: ‘NoneType'»

Как я могу это решить?

заранее большое спасибо

Ответ №1:

Добавьте это перед вашей попыткой / за исключением:

 if distributed is None:
    distributed = 0
  

Или добавить or 0 после запроса о денежном потоке:

 distributed = (CashFlow.objects
    .filter(item__slug=itemslug)
    .filter(type='cashout')
    .aggregate(sum=Sum('amount'))['sum']) or 0
  

Сделайте то же самое с called .

Комментарии:

1. Еще проще: if not (called and distributed): result = 0 , т.е. если какой-либо из агрегатов равен None или 0, результат равен 0 (если это то, что вы хотите). В предложении else вы вводите фактический расчет. Тогда вы даже можете сохранить попытку / исключение.

Ответ №2:

Добавьте TypeError к своим исключениям в except

 try:
   result = round(-distributed/called * 100,2)
except (ZeroDivisionError, TypeError) as e :
   result = 0
  

Комментарии:

1. Спасибо. это тоже работает, но в моем конкретном случае — я не буду вдаваться в подробности — решение от Endre работает лучше всего! но еще раз спасибо за помощь и усилия!