【发布时间】:2010-10-14 05:32:30
【问题描述】:
return sum(jobrecord.get_cost() or 0
for jobrecord in self.project.jobrecord_set.filter(
date__lte=date,
date__gte=self.start_date) or 0)
【问题讨论】:
return sum(jobrecord.get_cost() or 0
for jobrecord in self.project.jobrecord_set.filter(
date__lte=date,
date__gte=self.start_date) or 0)
【问题讨论】:
0 确实不可迭代。我想你想放弃最后一个or 0。当过滤器查询不匹配任何元素时,它将返回一个空查询,并且您的总和将为 0,因为 sum([]) 为零。
如果由于某种原因查询可能引发异常(无效日期等),or 子句也不会捕获该异常。 [][1] or 0 仍然会引发异常。
【讨论】:
稍微改写后
query = self.project.jobrecord_set.filter(
date__lte=date,
date__gte=self.start_date)
values= ( jobrecord.get_cost() or 0 for jobrecord in query or 0 )
return sum( values )
仔细查看values= ( jobrecord.get_cost() or 0 for jobrecord in query or 0 )
查询为空时会发生什么?
你正在评估jobrecord.get_cost() or 0 for jobrecord in 0
【讨论】: