如何让DRF同一Serializer同时支持外键ID传入与嵌套数据返回?
解决方案
要实现POST传ID、GET返回嵌套数据且字段名一致的需求,只需修改ModelBSerializer,通过重写序列化器的to_representation方法分别处理写入和读取逻辑:
class ModelBSerializer(serializers.ModelSerializer): # 写入时接收ModelA的ID,仅用于POST/PUT请求 model_a = serializers.PrimaryKeyRelatedField( queryset=ModelA.objects.all(), write_only=True ) class Meta: model = ModelB fields = '__all__' # 读取时返回嵌套的ModelA序列化数据 def to_representation(self, instance): # 先调用父类获取基础序列化结果 data = super().to_representation(instance) # 将model_a的ID替换为完整的ModelA序列化数据 data['model_a'] = ModelASerializer(instance.model_a).data return data
逻辑说明
- 写入阶段:
model_a字段被定义为PrimaryKeyRelatedField并设置write_only=True,只接收ModelA的ID值,完美匹配POST请求传入{"model_a": 1}的需求,同时会自动验证ID对应的ModelA是否存在。 - 读取阶段:重写
to_representation方法,把原本返回的ID值替换为ModelASerializer序列化后的嵌套对象,实现GET请求返回完整的ModelA数据结构。
验证效果
- POST请求传入:
{ "model_a": 1 }
- 请求成功后返回(与GET请求一致):
{ "id": 1, "model_a": { "id": 1, "name": "foo" } }
内容的提问来源于stack exchange,提问作者Johnny Herrera
相关产品推荐
相关产品推荐

