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

在Django REST序列化器中使用django-mptt包时如何获取父节点名称

解决方案

你当前使用的序列化器默认对外键字段使用主键序列化规则,所以parent字段仅返回父节点ID,完全可以实现返回父节点名称的需求,两种常用实现方式如下:

方案1:仅返回父节点名称(无额外嵌套结构)

适合只需要父节点名称、不需要其他父节点属性的场景,直接在序列化器中新增自定义字段即可:

from rest_framework import serializers

class DepartmentDetailSerializer(ModelSerializer):
    # 自定义字段获取父节点名称
    parent_name = serializers.SerializerMethodField()
    
    class Meta:
        model = Department
        # 可根据需求选择保留原parent字段(返回ID)或删除,此处同时保留两个字段做示例
        fields = ('id', 'name', 'status', 'slug', 'desc', 'parent', 'parent_name')
    
    def get_parent_name(self, obj):
        # 兼容父节点为空的边界情况
        return obj.parent.name if obj.parent else None

方案2:嵌套返回父节点多字段信息(如同时需要ID和名称)

如果需要父节点的多个属性,可通过嵌套序列化器实现:

from rest_framework import serializers

# 先定义轻量的父部门序列化器,仅序列化需要对外暴露的字段
class ParentDepartmentSerializer(ModelSerializer):
    class Meta:
        model = Department
        fields = ('id', 'name')

class DepartmentDetailSerializer(ModelSerializer):
    # 指定parent字段使用嵌套序列化器,设置read_only=True避免提交数据时的校验异常
    parent = ParentDepartmentSerializer(read_only=True)
    
    # 若需要支持提交父节点ID完成创建/更新操作,新增以下可写字段即可
    parent_id = serializers.PrimaryKeyRelatedField(
        queryset=Department.objects.all(),
        source='parent',
        write_only=True,
        allow_null=True
    )
    
    class Meta:
        model = Department
        fields = ('id', 'name', 'status', 'slug', 'desc', 'parent', 'parent_id')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:15:03