AngularJS向Django(MongoDB)提交数据时Object ID丢失问题求助
解决AngularJS提交数据到Django+MongoDB时Object ID丢失的问题
看起来你遇到的问题核心在于MongoDB扩展JSON格式的解析和AngularJS序列化规则的冲突,下面我帮你拆解原因并给出具体的解决方案:
可能的原因1:AngularJS序列化时自动过滤了$开头的属性
AngularJS自带的angular.toJson()方法默认会排除所有以$开头的属性——这就导致你提交的_id: {$oid: "xxx"}里,$oid会被直接过滤掉,后端收到的_id变成空对象,最终丢失ID信息。
前端解决方案
你有两种选择:
方案A:保留扩展JSON格式提交
改用原生JSON.stringify()代替angular.toJson(),它不会过滤$开头的属性:const subjectToSubmit = { skillName: "Professional Skills", _id: {$oid: "5adf23946ab671bf6cb36aff"} }; $http.post('/saveSubjectView', JSON.stringify(subjectToSubmit), { headers: {'Content-Type': 'application/json'} }).then(response => { // 处理成功响应 }).catch(error => { // 处理错误 });方案B:简化ID格式提交
提前提取$oid的值,直接提交字符串格式的ID,这样用angular.toJson()也不会有问题:const subjectToSubmit = { skillName: "Professional Skills", _id: "5adf23946ab671bf6cb36aff" // 直接用$oid对应的字符串 }; $http.post('/saveSubjectView', subjectToSubmit).then(...);
可能的原因2:后端解析扩展JSON的方式错误
你的现有代码先用Django的JSONParser解析请求体,得到的是普通Python字典(_id是{'$oid': 'xxx'}),之后的json_util.dumps()再json.loads()操作并没有将其转换为MongoDB可识别的ObjectId类型,导致后续操作中ID无法被正确识别。
后端解决方案
对应前端的两种提交方式,后端也有两种处理方式:
如果前端提交的是带
$oid的扩展JSON
直接用pymongo的json_util解析原始请求体,它会自动把$oid结构转换为ObjectId类型:from django.http import JsonResponse from rest_framework.decorators import api_view, csrf_exempt from bson import json_util, ObjectId import pprint as pp @csrf_exempt @api_view(['GET','POST']) def saveSubjectView(request): if request.method == 'POST': try: # 直接用json_util解析原始请求体,自动处理MongoDB扩展JSON subject = json_util.loads(request.body) print("Parsed subject (with ObjectId):") pp.pprint(subject) # 现在可以直接用subject['_id']操作MongoDB,比如更新文档 # db.subjects.update_one({"_id": subject["_id"]}, {"$set": subject}) return JsonResponse({"status": "success"}, status=200) except Exception as e: print(f"Error: {str(e)}") return JsonResponse({"error": str(e)}, status=400)如果前端提交的是字符串格式的ID
只需将字符串转换为ObjectId即可:from django.http import JsonResponse from rest_framework.decorators import api_view, csrf_exempt from rest_framework.parsers import JSONParser from bson import ObjectId import pprint as pp import json @csrf_exempt @api_view(['GET','POST']) def saveSubjectView(request): if request.method == 'POST': try: stream = StringIO(request.body) subject = JSONParser().parse(stream) # 将字符串ID转换为MongoDB ObjectId if '_id' in subject: subject['_id'] = ObjectId(subject['_id']) print("Processed subject:") pp.pprint(subject) # 后续MongoDB操作... return JsonResponse({"status": "success"}, status=200) except Exception as e: print(f"Error: {str(e)}") return JsonResponse({"error": str(e)}, status=400)
内容的提问来源于stack exchange,提问作者Cyber Square Professional
相关产品推荐
相关产品推荐

