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

