Django使用DRF ModelSerializer更新外键字段返回null无法修改问题
问题原因
你遇到的外键字段无法正常更新的核心原因是序列化器中配置了depth = 2参数。
DRF的depth参数用于开启嵌套序列化,展示关联表的深层数据,一旦设置该参数,所有关联外键字段会默认转为只读状态。序列化器只会读取数据库中已有的关联数据做嵌套展示,不会处理前端提交的外键ID写入请求,因此你传入的testConfiguration、testDescription的ID值被直接忽略,字段值保留为原来的null。
解决方案
方案1:拆分读写序列化器(推荐)
分别定义读写两个序列化器,适配不同场景的需求:
# 读序列化器:返回数据时使用,携带嵌套关联内容 class TestRequestReadSerializer(serializers.ModelSerializer): class Meta: model = TestRequest fields = [ 'id', 'title', 'testConfiguration', 'testDescription', ] depth = 2 # 写序列化器:创建/更新数据时使用,支持外键ID写入 class TestRequestWriteSerializer(serializers.ModelSerializer): class Meta: model = TestRequest fields = [ 'id', 'title', 'testConfiguration', 'testDescription', ]
视图层对应调整:更新操作时用写序列化器校验、保存数据,保存完成后用读序列化器序列化结果返回给前端即可。
方案2:显式声明外键字段覆盖只读属性
如果不想拆分序列化器,可以手动显式声明外键字段为可写:
class TestRequestSerializer(serializers.ModelSerializer): testConfiguration = serializers.PrimaryKeyRelatedField(queryset=TestConfiguration.objects.all(), allow_null=True) testDescription = serializers.PrimaryKeyRelatedField(queryset=TestDescription.objects.all(), allow_null=True) class Meta: model = TestRequest fields = [ 'id', 'title', 'testConfiguration', 'testDescription', ] depth = 2
该方案下序列化器可同时支持外键ID写入、返回嵌套关联数据两个需求。
内容的提问来源于stack exchange,提问作者Bence Birkás
相关产品推荐
相关产品推荐

