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
相关产品推荐
相关产品推荐

