TypeError: неподдерживаемый тип(ы) операнда для +: 'int' и 'Time'
Я хочу суммировать минуты, хранящиеся в моей таблице.
class Time(models.Model):
value = models.PositiveIntegerField(null=True)
Я пытаюсь суммировать минуты в функции def:
def sum(request):
times = ..._set.all()
for time in times:
total_min = total_min + time
Тогда у меня TypeError:
неподдерживаемый тип(ы) операндов для +: 'int' и 'Time'.
Проблема возникает из-за того, что я пытаюсь суммировать значения разных типов: int + объектный тип. И для решения проблемы мне нужно преобразовать объектную модель PositiveIntegerField в int. Но как это сделать не в классе, а в функции def?
Здесь time
является объектом Time
, и вы не можете сложить int
и Time
вместе. Что вы можете сделать, так это взять .value
объекта Time
. Поскольку .value
может быть None
, мы должны работать с time.value or 0
, чтобы добавить 0
в случае, если значение None
или 0
, так:
def sum(request):
some_object = …
total_min = 0
for time in some_object.time_set.all():
total_min += time.value or 0
But this is not very efficient: it requires to fetch all Time
objects from the database, and then performs the aggregation in at the Django/Python layer. You can do this at the database side with a Sum
expression [Django-doc] in an .aggregate(…)
clause [Django-doc]:
from django.db.models import Sum
def sum(request):
some_object = …
total_min = some_object.time_set.aggregate(total=Sum('value'))['total']
Note: Please do not name a variable
sum
, it overrides the reference to thesum
builtin function [Python-doc]. Use for examplesum_view
.