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

基于Djongo+MongoDB的Django API返回id为null问题求助

问题根源

  1. Django模型未显式声明匹配MongoDB存储的主键字段,Django默认生成的id主键和MongoDB中实际存储的UUID主键字段不匹配,序列化时无法读取对应值导致返回null。
  2. 视图PUT、DELETE逻辑中引用的TestId字段未在模型中定义,运行时会触发字段不存在的报错。

修复步骤

1. 修改models.py,显式定义主键

根据你MongoDB中实际存储的主键字段名二选一即可:

情况1:MongoDB主键为默认的_id

from django.db import models
import uuid

class Test(models.Model):
    # 显式声明UUID类型主键,匹配MongoDB存储
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    testChar = models.CharField(max_length=255)
    testTwo = models.CharField(max_length=255)

情况2:MongoDB主键字段名为TestId(和你现有视图查询逻辑一致)

from django.db import models
import uuid

class Test(models.Model):
    TestId = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    testChar = models.CharField(max_length=255)
    testTwo = models.CharField(max_length=255)

2. 同步调整序列化器(仅Mongo主键为TestId时需要)

如果你的主键字段名为TestId,又需要接口返回的主键键名为id,修改serializers.py如下:

from rest_framework import serializers
from testapp.models import Test

class TestSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='TestId', read_only=True)
    class Meta:
        model = Test
        fields = '__all__'

3. 修正视图查询逻辑

如果采用上面的情况1(主键字段名为id),需要把PUT、DELETE方法中的查询字段替换为id:

# PUT方法修改
test=Test.objects.get(id=test_data['id'])
# DELETE方法修改
test=Test.objects.get(id=id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:24:03