报错TypeError:timedelta与NoneType无法执行+=运算,求解决方法
解决TypeError: unsupported operand type(s) for +=: 'datetime.timedelta' and 'NoneType'
嘿,这个错误其实很好定位——你遍历的视频集合里,有至少一个video.total_time的值是None,而datetime.timedelta类型根本没法和None做加法运算。咱们来一步步搞定这个问题:
1. 先搞清楚为什么会出现None值
先检查你的Video模型相关逻辑:
total_time字段是不是允许为空?比如Django里如果设置了null=True,数据库里可能存在该字段为空的记录- 计算
total_time的逻辑有没有漏洞?比如视频文件解析失败、元数据读取错误时,会不会返回None而不是有效的timedelta对象
2. 给代码加防护,避免None值干扰
不管是数据问题还是逻辑问题,我们都可以在累加时做判断,先处理掉None值:
方案A:跳过无有效时长的视频
如果那些total_time为None的视频不应该被计入总时长,直接跳过即可:
@property def total_duration_of_videos(self): videos_qs = self.videos.all() total_duration = datetime.timedelta(0) for video in videos_qs: # 只累加有有效时长的视频 if video.total_time is not None: total_duration += video.total_time hours, remainder = divmod(total_duration.seconds, 3600) minutes, seconds = divmod(remainder, 60) return f"{hours}:{minutes}:{seconds}"
这里用了f-string让字符串拼接更简洁,同时把初始的timedelta(0,0,0)简化成了timedelta(0),效果完全一致。
方案B:把None值当作0时长处理
如果不想跳过,而是把这些无时长的视频算成0,可以用or运算符给个默认值:
@property def total_duration_of_videos(self): videos_qs = self.videos.all() total_duration = datetime.timedelta(0) for video in videos_qs: # 如果total_time是None,就用0时长代替 total_duration += video.total_time or datetime.timedelta(0) hours, remainder = divmod(total_duration.seconds, 3600) minutes, seconds = divmod(remainder, 60) return f"{hours}:{minutes}:{seconds}"
3. 从根源杜绝None值(推荐)
如果total_time字段理论上应该始终有值,那建议从模型层面入手:
- 在
Video模型里把total_time设为不允许为空,比如Django中设置null=False, blank=False - 给
total_time设置默认值datetime.timedelta(0) - 检查计算
total_time的逻辑,确保无论什么异常情况(比如视频损坏、解析失败),都返回一个有效的timedelta对象,而不是None
这样从源头解决问题,后续代码就不用额外做防护啦。
内容的提问来源于stack exchange,提问作者Mahi C
相关产品推荐
相关产品推荐

