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

Django REST Framework中外键嵌套序列化问题(A->B->C)

解决DRF中三层嵌套外键的序列化问题

我来帮你搞定这个嵌套序列化的需求!其实你不用再折腾自定义RelatedField,用DRF自带的嵌套序列化器就能轻松实现你要的三层JSON结构,代码还更简洁好维护。

问题分析

你之前用RelatedField直接返回B对象,只能拿到B的基础字段,但没法自动关联到C。要实现A→B→C的嵌套,我们需要从最内层的C开始,逐层往上定义序列化器,让每个外层序列化器嵌套内层的。

具体实现步骤

  1. 先定义最内层的C序列化器:负责序列化C表的字段
  2. 定义B的序列化器:在里面嵌套C的序列化器,关联B的C外键
  3. 定义A的序列化器:嵌套B的序列化器,关联A的B外键

完整代码示例

from rest_framework import serializers
from .models import A, B, C

# 最内层:C的序列化器
class CSerializer(serializers.ModelSerializer):
    class Meta:
        model = C
        fields = ['C_id', 'C_name']  # 如果你需要所有字段,也可以用 '__all__'

# 中间层:B的序列化器,嵌套CSerializer
class BSerializer(serializers.ModelSerializer):
    # 关联B表中的C外键字段(假设你的字段名是C_id)
    C = CSerializer(source='C_id', read_only=True)
    
    class Meta:
        model = B
        fields = ['B_id', 'B_name', 'C']

# 最外层:A的序列化器,嵌套BSerializer
class ASerializer(serializers.ModelSerializer):
    # 关联A表中的B外键字段(假设你的字段名是B_id)
    B = BSerializer(source='B_id', read_only=True)
    
    class Meta:
        model = A
        fields = '__all__'

效果验证

用这个序列化器序列化A对象后,就能得到你想要的JSON结构:

{
  "A_id": 1,
  "A_name": "aaa",
  "B": {
    "B_id": 1,
    "B_name": "bbb",
    "C": {
      "C_id": 1,
      "C_name": "ccc"
    }
  }
}

小提示

  • 确保你的模型中外键关联是正确的:比如A的B_id是models.ForeignKey(B, ...),B的C_id是models.ForeignKey(C, ...)
  • 如果需要自定义某个层级的序列化逻辑,可以在对应的序列化器里覆写to_representation方法,比如想给B加额外字段,就在BSerializer里写:
    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['extra_field'] = '自定义内容'
        return data
    

内容的提问来源于stack exchange,提问作者Nishanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:49:26