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

Django REST Framework Serializers配置导致两接口返回相同数据问题求助

问题根因

你遇到的问题主要由两个错误导致:

  1. SchoolSerializer 定义错误:继承的是普通Serializer而非ModelSerializer,导致Meta配置不生效,同时存在语法错误(字段定义多写了一个等于号)和缩进问题。
  2. 路由注册顺序错误:r'school'前缀会匹配所有以school开头的路径,如果注册顺序早于r'schoolname',访问/schoolname时会被优先匹配到SchoolViewSet,将name当做学校ID参数处理,返回单条学校的完整信息。

解决方案

方案一:保留双ViewSet写法,修正错误

1. 修复serializers.py

# 修正继承类、语法错误和缩进
class SchoolSerializer(serializers.ModelSerializer):
    is_existing_student = serializers.BooleanField()
    student = StudentSerializer(many=True)

    class Meta:
        model = School
        fields = ['is_existing_student', 'name', 'city', 'street', 'student']

class SchoolNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = School
        fields = ['name']

2. 调整urls.py注册顺序

长前缀优先注册,避免短前缀提前匹配:

router.register(r'schoolname', SchoolNameViewSet)
router.register(r'school', SchoolViewSet)

调整后:

  • 访问/schoolname/返回所有学校名称列表
  • 访问/school/返回所有学校完整信息

方案二:单ViewSet动态切换Serializer(更推荐)

不需要维护两个重复的ViewSet,通过自定义action实现需求,代码更简洁:

1. 调整views.py

from rest_framework.decorators import action
from rest_framework.response import Response

class SchoolViewSet(mixins.CreateModelMixin, RetrieveModelMixin, 
  ListModelMixin, GenericViewSet):
    serializer_class = SchoolSerializer
    queryset = School.objects.all()

    # 自定义获取学校名称列表的接口
    @action(methods=['get'], detail=False, url_path='names')
    def list_names(self, request):
        serializer = SchoolNameSerializer(self.get_queryset(), many=True)
        return Response(serializer.data)

2. 简化urls.py

仅需注册一个ViewSet即可:

router.register(r'school', SchoolViewSet)

接口调用规则:

  • 访问 /school/ 返回所有学校完整信息
  • 访问 /school/names/ 返回所有学校名称列表

内容的提问来源于stack exchange,提问作者user13066942

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:36:06