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

Django DRF如何实现Route、POIInRoute、POI三层嵌套对象序列化

Django DRF三层嵌套序列化问题修复方案

核心问题定位

你的代码问题出在POIInRoute对应的序列化器(原pirSerializer)定义部分:

  1. 单个POIInRoute对象仅关联1个POI对象,你加了many=True参数(该参数仅用于一对多/多对多的批量序列化场景)
  2. 自定义的poi序列化字段没有绑定数据源,DRF无法从POIInRoute实例中找到对应属性返回数据
  3. 原序列化器字段列表中保留了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:27:02