drf 视图类

-  Django REST framwork 提供的视图的主要作用?

  - 控制序列化器的执行(检验,保存,转换数据)

  - 控制数据库查询的执行

- REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。

1. APIView

  APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

APIViewView的不同之处在于:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;

  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;

  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;

  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

支持定义的类属性

  • authentication_classes 列表或元祖,身份认证类

  • permissoin_classes 列表或元祖,权限检查类

  • throttle_classes 列表或元祖,流量控制类

APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。

from django.shortcuts import render
from django.views import View
from rest_framework.views import APIView
# Create your views here.
from ser import models
from req.serializers import StudentModelSerializer
from rest_framework.response import Response

from rest_framework import status

class StudentsView(APIView):
    # 获取所有数据
    def get(self,request):
        # http://127.0.0.1:8000/req/students/?a=1&b=2&b=3  b可能为多选数据
        print(request.query_params)  # -- request.GET  <QueryDict: {'a': ['1'], 'b': ['2', '3']}>
        # print(request.GET)
        # print(request.query_params.getlist('b'))
        students = models.Student.objects.all()
        serializer_obj = StudentModelSerializer(instance=students,many=True)

        # return Response(serializer_obj.data,status=400)
        return Response(serializer_obj.data)

    # 添加单条记录
    def post(self,request):
        serializer_obj = StudentModelSerializer(data=request.data)
        if serializer_obj.is_valid():

            new_obj = models.Student.objects.create(**serializer_obj.validated_data)

            obj = StudentModelSerializer(instance=new_obj)

            return Response(obj.data, status=status.HTTP_201_CREATED)


class StudentView(APIView):
    # 获取所有数据
    def get(self, request, pk):

        student = models.Student.objects.get(pk=pk)
        serializer_obj = StudentModelSerializer(instance=student)

        return Response(serializer_obj.data)
    # 更新单条记录
    def put(self,request,pk):
        student = models.Student.objects.get(pk=pk)
        data = request.data
        serializer_obj = StudentModelSerializer(instance=student,data=data,partial=True)

        if serializer_obj.is_valid():
            instance = serializer_obj.save()
            new_serializer_obj = StudentModelSerializer(instance=instance)
            return Response(new_serializer_obj.data,status=status.HTTP_202_ACCEPTED)
        else:
            return Response({'error':"检验失败"})
    # 删除单条记录
    def delete(self, request, pk):
        models.Student.objects.get(pk=pk).delete()
        # return Response(None,)
        return Response('', status=status.HTTP_204_NO_CONTENT)

urls.py

from django.urls import path,re_path,include #  re_path --- django1.11 url
from req import views
urlpatterns = [

    path('students/', views.StudentsView.as_view()),
    re_path('students/(?P<pk>\d+)/', views.StudentView.as_view()),


]

2.GenericAPIView[通用视图类]

继承自APIVIew主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

提供的关于序列化器使用的属性与方法

  • 属性:

    • serializer_class 指明视图使用的序列化器

  • 方法:

    • get_serializer_class(self)

      当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在get_serializer_class方法中通过返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象了。

      返回序列化器类,默认返回serializer_class,可以重写,例如:

  # 当试图中使用多个序列化器类时,可以使用该方法来区分
    def get_serializer_class(self):
        print('111111111111')
        if self.request.method == 'GET':
            return StudentModelSerializer2
      else:
            return StudentModelSerializer
  • get_serializer(self, args, *kwargs)

    返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。

    注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

    比如serializer = self.get_serializer(instance=self.get_object(),context={'pk':pk}),下面的request和view我们后面会用到,现在先了解一下,后面使用就知道了

    • request 当前视图的请求对象

    • view 当前请求的类视图对象

    • format 当前请求期望返回的数据格式

提供的关于数据库查询的属性与方法

  • 属性:

    • queryset 指明使用的数据查询集

  • 方法:

    • get_queryset(self)

      返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

 

 

posted @ 2021-12-02 17:55  urls  阅读(37)  评论(0编辑  收藏  举报