Django DRF如何实现Route、POIInRoute、POI三层嵌套对象序列化
Django DRF三层嵌套序列化问题修复方案
核心问题定位
你的代码问题出在POIInRoute对应的序列化器(原pirSerializer)定义部分:
- 单个
POIInRoute对象仅关联1个POI对象,你加了many=True参数(该参数仅用于一对多/多对多的批量序列化场景) - 自定义的
poi序列化字段没有绑定数据源,DRF无法从POIInRoute实例中找到对应属性返回数据 - 原序列化器字段列表中保留了
POIID、routeID两个外键ID字段,会和嵌套序列化结果冗余,可以按需移除
修复后完整代码
# 序列化器类名建议遵循大驼峰命名规范,不影响功能仅为开发惯例 class POISerializer(serializers.ModelSerializer): class Meta: model = POI fields = ('id','description','cemiterio','cemiterioID','gisID') class POIInRouteSerializer(serializers.ModelSerializer): # 通过source参数绑定到模型外键字段POIID,去掉错误的many=True poi = POISerializer(read_only=True, source='POIID') class Meta: model = POIInRoute # 已嵌套返回完整POI对象,可按需删除POIID、routeID两个外键ID字段 fields = ('id', 'description', 'order','poi') class RouteSerializer(serializers.ModelSerializer): # Route和POIInRoute是一对多关联,原有定义正确无需修改 pirs = POIInRouteSerializer(many=True, read_only=True) class Meta: model = Route fields = ('id','name','description','public', 'pirs')
补充说明
如果你的接口仅做查询只读使用,上述修改即可满足三层嵌套序列化需求;如果需要支持嵌套创建/更新操作,需要额外重写序列化器的create、update方法处理关联对象的写入逻辑。
内容的提问来源于stack exchange,提问作者Manuel Domingues
相关产品推荐
相关产品推荐

