我想在我的表中记录分钟数。
class Time(models.Model):
value = models.PositiveIntegerField(null=True)
我试图在deffunction:
中对分钟求和def sum(request):
times = ..._set.all()
for time in times:
total_min = total_min + time
然后是TypeError:
不支持+:'int'和'Time'的操作数类型。
出现问题是因为我试图总结不同类型的值:int +对象类型。为了解决这个问题,我需要将对象模型PositiveIntegerField转换为int。但如何在deffunction中,而不是在课堂上做呢?
此处time
为Time
对象,不能同时添加int
和Time
对象。你能做的就是取Time
对象的.value
。因为.value
可以是None
,所以如果值是None
或0
,我们应该使用time.value or 0
来添加0
,所以:
def sum(request):
some_object = …
total_min = 0
for time in some_object.time_set.all():
total_min +=time.value or 0
但是这不是很有效:它需要从数据库中获取所有的Time
对象,然后在Django/Python层执行聚合。您可以在数据库端使用Sum
来完成此操作表达式[Django-doc]in an.aggregate(…)
条款<一口>[Django-doc]一口>:
from django.db.models import Sum
def sum(request):
some_object = …
total_min = some_object.time_set.aggregate(total=Sum('value'))['total']
注意:请不要将变量命名为
sum
,它会覆盖对sum
的引用。内置函数[Python-doc]。例如使用sum_view
.