如何实现Django REST Framework嵌套关系并返回关联课程完整明细
问题根因
嵌套序列化字段lessons的定义位置错误:你将其放在了StuSerializer的Meta内部类中,DRF只会将序列化器直接定义的类属性识别为自定义序列化规则,Meta内部仅用于配置模型关联、字段列表等元信息,因此你的嵌套规则没有生效,接口默认只返回关联数据的主键。
修正代码
仅需要调整Serializers.py中StuSerializer的定义,将lessons字段移到序列化器类层级即可:
class StuSerializer(serializers.ModelSerializer): # 嵌套序列化字段必须定义在类层级,不可放在Meta内部 lessons = LessonSerializer(many=True, read_only=True) class Meta: model = Student fields = ('first_name', 'last_name', 'information', 'lessons')
可选优化
为避免查询学生列表时出现N+1性能问题,可以调整Views.py中StuList的查询集,预加载关联的课程数据:
class StuList(generics.ListCreateAPIView): # 用prefetch_related预加载关联的lessons,减少数据库查询次数 queryset = Student.objects.all().prefetch_related('lessons') serializer_class = StuSerializer
如果需要返回课程的全部明细字段,直接把嵌套的序列化器替换为LessonDetailSerializer即可。
内容的提问来源于stack exchange,提问作者Anat
相关产品推荐
相关产品推荐

