You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 08:52:31