#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 работает лучше всего! но еще раз спасибо за помощь и усилия!