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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:28:00