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
相关产品推荐
相关产品推荐

