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

Django REST Framework如何实现自关联模型的子元素嵌套序列化?

解决方案

方案1:使用SerializerMethodField手动序列化(全版本DRF通用,兼容性最好)

直接在序列化器中定义SerializerMethodField字段,在取值方法中手动实例化自身序列化器处理子节点即可:

class ItemSerializer(serializers.HyperlinkedModelSerializer):
    children = serializers.SerializerMethodField(read_only=True)

    def get_children(self, instance):
        # 需传递context上下文,避免超链接类字段序列化丢失请求信息
        return ItemSerializer(instance.children.all(), many=True, context=self.context).data

    class Meta:
        model = Item
        fields = ("name", "dashboard", "config", "children")

方案2:重写__init__方法动态添加字段

序列化器类初始化完成后自身已经完成定义,此时可以直接引用自身类动态插入字段:

class ItemSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Item
        fields = ("name", "dashboard", "config", "children")

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["children"] = ItemSerializer(many=True, read_only=True)

方案3:DRF高版本原生自引用(3.14及以上版本支持)

高版本DRF支持直接用self关键字引用当前序列化器自身,写法最简:

class ItemSerializer(serializers.HyperlinkedModelSerializer):
    children = serializers.ListField(child="self", read_only=True)

    class Meta:
        model = Item
        fields = ("name", "dashboard", "config", "children")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:06:02