Django REST Framework Serializers配置导致两接口返回相同数据问题求助
问题根因
你遇到的问题主要由两个错误导致:
SchoolSerializer定义错误:继承的是普通Serializer而非ModelSerializer,导致Meta配置不生效,同时存在语法错误(字段定义多写了一个等于号)和缩进问题。- 路由注册顺序错误:
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
相关产品推荐
相关产品推荐

