Django导出模型数据到Excel时遇'ModelBase' object is not iterable错误
解决Django导出Excel时'ModelBase' object is not iterable错误
嘿,我一眼就瞅到问题所在了!你遇到的'ModelBase' object is not iterable错误,根源出在最后写入Excel的循环里——你居然直接去遍历Task模型类了,而不是你之前已经获取到的数据集合!
错误根源分析
你原来的这段循环代码完全写错了遍历对象:
for Name,Image1,Image2,Date in (Task):
Task是Django的模型类(也就是ModelBase类型的对象),它本身不是可迭代的数据集合,自然会抛出“不可迭代”的错误。你应该遍历的是之前获取的查询集plans,或者你整理好的列表b。
修正方案一:直接遍历查询集plans
这是最直接的方式,用你已经从数据库取出的plans查询集来遍历写入:
# 先清空原来的错误循环,替换成下面的代码 row = 1 col = 0 # 先写入表头(可选,让Excel结构更清晰) worksheet.write(0, col, "任务名称") worksheet.write(0, col+1, "图片1链接") worksheet.write(0, col+2, "图片2链接") worksheet.write(0, col+3, "日期") for plan in plans: # 写入名称 worksheet.write(row, col, plan.Name) # 处理图片字段为空的情况,避免AttributeError worksheet.write(row, col+1, plan.Image1.url if plan.Image1 else "无图片") worksheet.write(row, col+2, plan.Image2.url if plan.Image2 else "无图片") # 日期字段转成字符串格式,避免Excel解析异常 worksheet.write(row, col+3, plan.Date.strftime("%Y-%m-%d") if plan.Date else "无日期") row += 1
修正方案二:遍历你整理好的列表b
如果你已经把数据整理到b列表里了,也可以直接遍历这个列表:
row = 1 col = 0 # 写入表头 worksheet.write(0, col, "任务名称") worksheet.write(0, col+1, "图片1链接") worksheet.write(0, col+2, "图片2链接") worksheet.write(0, col+3, "日期") for item in b: worksheet.write(row, col, item["Name"]) worksheet.write(row, col+1, item["Image1"] if item["Image1"] else "无图片") worksheet.write(row, col+2, item["Image2"] if item["Image2"] else "无图片") worksheet.write(row, col+3, item["Date"].strftime("%Y-%m-%d") if item["Date"] else "无日期") row += 1
额外提醒
- 空值处理:你的
Image1、Image2、Date字段都允许为空,一定要做判断后再访问属性,不然会触发AttributeError。 - 返回值问题:你最后
return Response({'success':b,"sheet":worksheet})里的worksheet是xlsxwriter的对象,没法直接序列化返回给前端,建议只返回成功状态和数据列表b,或者返回生成的Excel文件的下载路径。 - 文件保存:确保你的Django项目有生成
data.xlsx的权限,或者指定一个绝对路径来保存文件。
内容的提问来源于stack exchange,提问作者Ashuosh Mishra
相关产品推荐
相关产品推荐

