Django REST Framework嵌套序列化创建时如何返回关联id列表
实现方案
你当前接口仅返回project_name字段,是因为序列化器未配置关联模型的嵌套输出规则,按以下步骤调整即可返回项目对应的关联id/关联数据列表:
关联逻辑说明
三个模型的关联层级为:Project(1对多)ProjectSite(1对多)Assignment,反向关联的取值锚点就是外键字段上定义的related_name参数,配置时不要写错取值路径。
写法1:返回完整嵌套关联数据
从最内层模型开始逐层定义序列化器:
- 最内层Assignment序列化器
from rest_framework import serializers from .models import Project, ProjectSite, Assignment class AssignmentSerializer(serializers.ModelSerializer): class Meta: model = Assignment # 按需调整返回字段,仅需要id就只留assignment_id fields = ["assignment_id", "assignment_name", "assigned_to_id"]
- 中间层ProjectSite序列化器
class ProjectSiteSerializer(serializers.ModelSerializer): # 对应Assignment外键site_id配置的related_name="projectsiteidkey" assignment_list = AssignmentSerializer(many=True, read_only=True, source="projectsiteidkey") class Meta: model = ProjectSite # 仅需要站点id就只保留site_id fields = ["site_id", "site_name", "assignment_list"]
- 最外层Project序列化器
class ProjectSerializer(serializers.ModelSerializer): # 对应ProjectSite外键project_id配置的related_name="projectid" site_list = ProjectSiteSerializer(many=True, read_only=True, source="projectid") class Meta: model = Project fields = ["project_id", "project_name", "site_list"]
写法2:仅返回关联id列表
如果不需要嵌套详情,只需要纯id数组,不用定义多层序列化器,直接用PrimaryKeyRelatedField即可:
class ProjectSerializer(serializers.ModelSerializer): # 直接取关联的站点id列表 site_id_list = serializers.PrimaryKeyRelatedField( many=True, read_only=True, source="projectid" ) class Meta: model = Project fields = ["project_id", "project_name", "site_id_list"]
注意事项
- 嵌套字段配置
read_only=True仅支持GET场景的返回,如果需要通过Project接口同时写入/修改关联的站点、任务数据,需要自行重写序列化器的create/update方法处理嵌套写入逻辑 - 所有关联字段的
source参数必须和对应外键上的related_name完全一致,否则会抛出字段不存在的错误 - 模型字段中
site_name配置的name='project_site_name'是数据库层面的列名配置,不影响序列化器的字段引用,序列化器取模型字段名site_name即可
内容的提问来源于stack exchange,提问作者Vas
相关产品推荐
相关产品推荐

