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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:27:36