Django/DRF创建设备实体时无法指定关联用户外键的问题
Django DRF 创建设备时无法指定关联用户解决方案
问题原因
你在DeviceSerializer中显式配置了user = UserSerializer(read_only=True),该配置会产生两个效果:
- 接口返回数据时,关联的
user字段会输出完整的用户序列化信息 - 接口接收创建/更新请求时,
user字段被标记为只读,DRF不会解析传入的该字段参数,也不会在API交互页面渲染对应的输入框,因此你无法传入用户关联信息
修复方案
根据你的业务需求选其中一种即可:
方案1:保留返回时嵌套用户信息
如果需要接口返回设备数据时同时带出完整的用户信息,新增一个仅用于写入的用户ID字段即可,修改序列化器代码:
class DeviceSerializer(serializers.ModelSerializer): # 保留只读的嵌套用户字段,用于返回响应 user = UserSerializer(read_only=True) # 新增写字段,接收用户ID,仅参与请求解析不参与返回 user_id = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), source="user", write_only=True ) class Meta: model = Device fields = "__all__"
修改后刷新API页面即可看到user_id输入框,创建设备时传入对应用户的ID即可完成关联,返回数据依然保留完整的嵌套用户信息。
方案2:不需要嵌套返回用户信息
如果接口返回设备数据时只需要用户ID不需要完整用户信息,直接删掉你显式声明的user = UserSerializer(read_only=True)即可,DRF会自动生成默认的可读写外键字段,支持直接传入用户ID完成关联。
内容的提问来源于stack exchange,提问作者Oros Tom
相关产品推荐
相关产品推荐

