Django DRF 带中间关联表的多对多关系嵌套序列化实现
完全可以基于你现有的中间表结构实现需求,无需额外添加ManyToManyField字段,也不会破坏你现有的表规范化设计,具体实现如下:
1. 编写序列化器
首先定义精简的Course序列化器,仅返回需要的code和name字段,再通过SerializerMethodField自定义Programme序列化器中的courses字段,通过中间表的关联关系获取课程数据:
from rest_framework import serializers from .models import Programme, Course # 精简Course序列化器,仅返回需要的字段 class SimpleCourseSerializer(serializers.ModelSerializer): class Meta: model = Course fields = ('code', 'name') class ProgrammeSerializer(serializers.ModelSerializer): # 自定义关联课程字段 courses = serializers.SerializerMethodField() class Meta: model = Programme fields = ('title', 'name', 'faculty', 'courses') def get_courses(self, obj): # 通过中间表的related_name拿到所有关联的中间表记录,提取对应的Course对象序列化后返回 return SimpleCourseSerializer( [pc.courseID for pc in obj.courses.all()], many=True ).data
2. 优化查询性能(可选)
为了避免N+1查询问题,在视图查询Programme实例时,使用prefetch_related预加载关联的中间表和课程数据:
from rest_framework import viewsets from .models import Programme from .serializers import ProgrammeSerializer class ProgrammeViewSet(viewsets.ReadOnlyModelViewSet): # 预加载关联的中间表和课程数据 queryset = Programme.objects.all().prefetch_related('courses__courseID') serializer_class = ProgrammeSerializer
以上实现完全基于你现有模型的关联关系,最终返回的接口格式和你期望的完全一致。
内容的提问来源于stack exchange,提问作者Thibatsane Ivan Mahlelebe
相关产品推荐
相关产品推荐

