Python遍历含字典的JSON列表并将API数据写入Django模型时的报错排查
我来帮你梳理下代码里的几个问题,咱们一个一个解决:
1. 缩进错误(IndentationError)
从报错信息里的IndentationError: unexpected unindent能看出来,你调用get_data()的时候缩进出问题了。Python是严格靠缩进区分代码块的,你得确保get_data()的调用位置和周围代码保持一致的缩进级别,不能突然减少缩进(比如如果它是在Django命令的handle方法里,要和方法内其他代码对齐)。
2. 响应对象直接用字典索引的错误
你写的response['results']是错的——requests.get()返回的是响应对象,不是直接的JSON字典。你得先调用response.json()把响应内容转换成Python字典,才能去取results字段:
response = requests.get(settings.HOST+settings.PATH, verify=False) # 先把响应解析成JSON字典 data_dict = response.json() for data in data_dict['results']: print(data) # 后续操作...
这就是你碰到list indices must be integers or slices, not str错误的原因:你试图用字符串索引去访问响应对象,而不是转换后的字典。
3. Django模型创建对象的方法错误
Django模型创建新对象的标准方法是MyModel.objects.create(**data),而不是MyModel.add(**data)(除非你自己给模型类写了add静态方法,但看你的代码应该没做这个)。所以这里要改成:
mydata = MyModel.objects.create(**data)
这样才能正确把API返回的数据存入你的Django模型。
4. 未定义变量的返回错误
你的代码最后写了return results,但results这个变量在函数里根本没定义过。如果你想返回API获取到的结果列表,可以改成返回data_dict['results'];如果想返回创建好的模型对象,也可以提前收集后返回。
修正后的完整代码示例
def get_data(): try: response = requests.get(settings.HOST+settings.PATH, verify=False) # 解析响应为JSON字典 data_dict = response.json() # 可选:收集创建的模型对象 created_objects = [] for data in data_dict['results']: print(data) # 正确创建模型实例 mydata = MyModel.objects.create(**data) created_objects.append(mydata) # 返回创建的对象或原始结果 return created_objects except Exception as e: # 建议加上异常捕获,方便排查问题 print(f"获取或保存数据出错: {e}") raise
另外提醒下:verify=False会关闭SSL证书验证,生产环境尽量不要这么用,建议配置正确的CA证书。
内容的提问来源于stack exchange,提问作者sokolata

