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 the sum builtin function [Python-doc]. Use for example sum_view.

Вернуться на верх