基于Djongo+MongoDB的Django API返回id为null问题求助
问题根源
- Django模型未显式声明匹配MongoDB存储的主键字段,Django默认生成的
id主键和MongoDB中实际存储的UUID主键字段不匹配,序列化时无法读取对应值导致返回null。 - 视图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
相关产品推荐
相关产品推荐

