多个序列化器类同时调用的问题

同时调用多个序列化器类问题

调用序列化器类需要用到框架中封装好的一个方法get_serialzier_class来实现

一、视图集中调用

1. view.py

from .serializers import Student1ModelSerializer
class Studnet1GenericAPIView(GenericAPIView):
    queryset = Student.objects.all()
    serializer_class = Student1ModelSerializer
    
    def get_serializer_class(self):
        # 在框架中提供了get_serializerz-class方法来重写序列化器类,可以为不同的方法提供对应的序列化器类
        # 这样的话一个视图类中可以同时调用多个序列化器类
        if self.request.method == 'GET':
            # 注意:这里的方法名必须使用大写, 小写的话系统会识别错误
            # 具体使用哪个序列化器类需要判读request对应的方法,注意从前端传递过来的已经包括request,
            # 这里可以直接通过self来调用,但是一般我们在方法中需要写明reqeust参数
            return Student1ModelSerializer
        else:
            return StudentModelSerializer
    
    def get(self, request):
        # 获取所有数据中的id和name字段
        student_list = self.get_queryset()
        serializer = self.get_serializer(instance=student_list, many=True)
        return Response(serializer.data)
    
    def post(self, request):
        # 往数据库中添加一条数据
        data_dict = request.data
        serializer = self.get_serializer(data=data_dict)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)
View Code

2. urls.py

1 urlpatterns = [
2     path('student5/', views.Studnet1GenericAPIView.as_view()),    
3 ]

 

二、视图集中调用

1. view.py

 1 # 视图集中调用多个序列化器类
 2 from rest_framework.viewsets import ModelViewSet
 3 class StudentModelViewSet(ModelViewSet):
 4     queryset = Student.objects.all()
 5     serializer_class = Student1GenericAPIView
 6     def get_serializer_class(self):
 7         if self.action == 'list':
 8             # 注意:这里直接是在self下的action属性进行判断,
 9             # 这里不能添加request,因为它不具备actin属性
10             return StudentModelSerializer
11         else:
12             return Student1ModelSerializer

2. urls.py

 1 urlpatterns = [
 2     path('student6/', views.StudentModelViewSet.as_view({'get':     'list'})),
 3     path('student6/<int: pk>', views.StudentModelViewSet.as_view({'get': 'retrieve'})),
 4 ]
 5 # 实例化路由类
 6 # 视图类默认只会给视图集中的基本api接口生成地(生成一条、生成多条、更新一条、删除一条、添加一条数据)
 7 # 我们自己编写的处理方法名(例如:get_10等),视图类并不会生成地址
 8 from rest_framework.routers import SimpleRouter, DefaultRouter
 9 router = DefaultRouter()
10 # 注册视图集类
11 router.register('student6', views.StudentModelViewSet)
12 # 把注册好的视图类拼接到urlpatterns中
13 urlpatterns += router

三、脑图

posted @ 2019-12-27 17:16  大道至诚  阅读(307)  评论(0编辑  收藏  举报