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

Django中用update_or_create()处理JSON缺失键并设置默认值

解决JSON缺失键时向Django模型设置默认值的问题

当从JSON文件向Django模型推送数据时,若JSON对象缺失目标字段(如title),直接通过item['title']访问会抛出KeyError。以下是几种在键不存在时自动设置默认值的方案:

示例场景

示例JSON数据

{"timestamp":"2023-04-20T15:45:53.085646251+05:30","status_code":200,"content_length":17620,"failed":false, "title":"Test Website"}
{"timestamp":"2023-04-20T15:45:53.085646251+05:30","status_code":200,"content_length":17620,"failed":false}

报错的原代码

data = []
for line in open('results.json', 'r'):
    data.append(json.loads(line))
    
for item in data:
    obj, created = http.objects.update_or_create(asset=item['input'], defaults={
        'status_code':item['status_code'],
        'title':item['title'],
        'last_added':datetime.now()},)

解决方案

1. 使用字典get()方法(推荐)

字典的get()方法允许你指定键不存在时的默认值,这是最简洁的处理方式:

import json
from datetime import datetime

data = []
for line in open('results.json', 'r'):
    data.append(json.loads(line))
    
for item in data:
    obj, created = http.objects.update_or_create(
        asset=item['input'], 
        defaults={
            'status_code': item['status_code'],
            'title': item.get('title', 'N/A'),  # 键不存在时返回'N/A'
            'last_added': datetime.now()
        }
    )

2. 提前合并默认值(多字段场景)

如果有多个字段可能缺失,可以先定义默认值映射,再与JSON数据合并(JSON中的键会覆盖默认值):

import json
from datetime import datetime

# 定义所有可能缺失字段的默认值
default_fields = {
    'title': 'N/A',
    # 可添加其他字段,比如'content_length': 0
}

data = []
for line in open('results.json', 'r'):
    data.append(json.loads(line))
    
for item in data:
    # 合并默认值与当前JSON项
    processed_item = {**default_fields, **item}
    obj, created = http.objects.update_or_create(
        asset=processed_item['input'], 
        defaults={
            'status_code': processed_item['status_code'],
            'title': processed_item['title'],
            'last_added': datetime.now()
        }
    )

3. 捕获KeyError异常(特殊逻辑场景)

如果需要对缺失键的情况执行额外逻辑,可以用try-except捕获异常:

import json
from datetime import datetime

data = []
for line in open('results.json', 'r'):
    data.append(json.loads(line))
    
for item in data:
    try:
        title = item['title']
    except KeyError:
        title = 'N/A'
        # 这里可以添加额外逻辑,比如打印日志
    obj, created = http.objects.update_or_create(
        asset=item['input'], 
        defaults={
            'status_code': item['status_code'],
            'title': title,
            'last_added': datetime.now()
        }
    )

内容的提问来源于stack exchange,提问作者Wr3nch0x1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:33:10