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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:57:04