Django计算上周日期报错:str与datetime.timedelta减法类型不支持
报错原因
触发unsupported operand type(s) for -: 'str' and 'datetime.timedelta'错误的核心原因是:通过request.GET.get()获取的请求参数默认是字符串类型,你打印看到的2022-06-06本质是str值,不是datetime.date类型对象,无法直接和timedelta类型做日期加减运算。
修复方案
- 先把拿到的日期字符串按照
年-月-日的固定格式,解析为date类型对象,再执行时间偏移计算 - 执行SQL时根据数据库字段的实际类型(字符串/日期类型)传入对应格式的值,避免参数类型不匹配
- 可额外增加参数非空判断、日期格式异常捕获逻辑,避免非法参数导致接口抛出500错误
修复后完整代码
from datetime import datetime, timedelta, date from django.db import connection def report(request): # 读取原始字符串格式的请求参数 start_date_str = request.GET.get('start_date') end_date_str = request.GET.get('end_date') # 将字符串解析为date对象,匹配传入参数的%Y-%m-%d格式 start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date() end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date() # date类型对象可正常与timedelta做日期运算 last_week_start_date = start_date - timedelta(days=7) last_week_end_date = last_week_start_date + timedelta(days=6) d_report = connection.cursor() # 若数据库存储的是字符串格式日期,传入原始字符串即可;若为date/datetime类型字段可直接传入解析后的date对象 d_report.execute( '''select * from table where start_date=%s and end_date=%s''', [start_date_str, end_date_str] ) # 需要用上一周日期查询时,可按需将last_week_start_date、last_week_end_date转成对应格式传入
内容的提问来源于stack exchange,提问作者Karishma Upadhyay
相关产品推荐
相关产品推荐

