使用Djongo插入数据遇唯一键冲突,如何将Pymongo错误转为JSON?
首先还原你遇到的错误场景:
FAILED SQL: INSERT INTO "brand" ("brand_id", "name", "notification_email", "notification_phone", "created_at", "updated_at") VALUES (%(0)s, %(1)s, %(2)s, %(3)s, %(4)s, %(5)s)
Pymongo error: {'index': 0, 'code': 11000, 'errmsg': 'E11000 duplicate key error collection: f2fretaildev.brand index: name_1 dup key: { : "shyamalas" }'}
Version: 1.2.26
这是使用Djongo(Django MongoDB ORM)插入数据时触发的唯一键重复错误。你尝试用json.dumps和json.loads转换错误信息却失败,核心原因是错误里的字典是Python风格的单引号格式,而JSON规范强制要求双引号,直接用JSON模块解析会触发语法错误。
下面提供两种可行的解决方案:
方案1:解析日志中的错误字符串
如果你的错误信息是从日志或字符串中提取的,先用ast.literal_eval解析成Python字典,再转JSON:
import ast import json # 提取Pymongo错误的字典部分字符串 pymongo_error_str = "{'index': 0, 'code': 11000, 'errmsg': 'E11000 duplicate key error collection: f2fretaildev.brand index: name_1 dup key: { : \"shyamalas\" }'}" # 安全解析为Python字典(支持单引号格式) error_dict = ast.literal_eval(pymongo_error_str) # 转换为标准JSON格式 error_json = json.dumps(error_dict, indent=2) print(error_json)
运行后会输出标准JSON:
{ "index": 0, "code": 11000, "errmsg": "E11000 duplicate key error collection: f2fretaildev.brand index: name_1 dup key: { : \"shyamalas\" }" }
方案2:直接捕获Pymongo异常
如果是在代码中直接处理异常,可以访问PymongoDuplicateKeyError的details属性拿到原生字典,再转JSON:
from pymongo.errors import DuplicateKeyError import json from djongo import models # 假设你的Brand模型 class Brand(models.Model): brand_id = models.CharField(max_length=50) name = models.CharField(max_length=100, unique=True) # 其他字段... try: # 插入重复name的记录 Brand.objects.create( brand_id="123", name="shyamalas", # 其他字段值... ) except DuplicateKeyError as e: # 获取错误详情字典 error_details = e.details # 转换为JSON error_json = json.dumps(error_details, indent=2) print(error_json)
这个方案更直接,不需要处理字符串解析,直接从异常对象中获取结构化数据。
内容的提问来源于stack exchange,提问作者Shyamala Gopalakrishnan

