drf复习

 

序列化器:

  做用:前端

    1.序列化:把模型类对象转化成字典,通过response以后变成json字符串数据库

    2.反序列化:把字典转化成模型类对象(客户端发送过来的数据,通过request以后变成字典)django

    3.完成数据校验功能(反序列化)json

 

序列化:

 

  定义好Serializer类后,就能够建立Serializer对象后端

   Serializer(instance=None, data=empty, **kwarg) 函数

  1.用于序列化的时候,将模型类对象传入instance参数(xxx.data获取序列化后的字典)post

  2.用于反序列化时,将要被反序列化的数据传入data参数ui

  3.除了instance和data参数外,在构造Serializer对象时,还可经过context参数额外添加数据,如 serializer = AccountSerializer(account, context={'request': request}) 经过context参数附加的数据,能够经过Serializer对象的context属性获取url

  4.若是序列化的不是单个模型类对象,而是查询集QuerySet,则使用many=True说明,例 serializer = StudentSerializer(instance=student_list,many=True) spa

 

反序列化:

  (xxx表明序实例化的列化器对象)

  1.在获取反序列化的数据以前,必须调用is_valid()方法进行验证,成功返回True,失败False(经过xxx.errors获取错误信息)(还能够在失败时抛出异常,传递raise_exception=True参数开启,例 xxx.is_valid(raise_exception=True )

  2.验证成功,使用xxx.validated_data属性获取数据

  3.定义序列化器时,指明每一个字段的序列号类型和选项参数,自己就是一种验证行为,还有三种验证方法

 

  验证方法:

    验证完成之后务必要返回传入的数据,失败 raise serializers.ValidationError("缘由") 

    1.def validate_<字段名>(用户提交的字段数据):

    2.def validate(实例化序列化器类时的data参数):

    3.在序列化类外面定义方法,在字段里直接使用 validators=[定义的方法] 

 

  序列化器实现了create跟update方法,若是建立序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,若是传递了instance实例,则调用save()方法的时候,update()被调用。

  说明:

    1.在对序列化器进行save()保存时,能够额外传递数据,这些数据能够在create()和update()中的validated_data参数获取到 serializer.save(owner=request.user) 

    2.默认序列化器必须传递全部required的字段,不然会抛出验证异常。可是咱们可使用partial参数来容许部分字段更新 serializer = StudentSerializer(instance=instance, data=data, partial=True) 

 

 

模型类序列化器

 

 

ModelSerializer与常规的Serializer相同,但提供了:

  1.基于模型类自动生成一系列字段

  2.基于模型类自动为Serializer生成validators,好比unique_together

  3.包含默认的create()和update()的实现

 

from rest_framework import serializers
from students.models import Student
class StudentModelSerializer(serializers.ModelSerializer):

    # 若是模型类序列化器,必须声明本次调用是哪一个模型,模型里面的哪些字段
    class Meta:
        model = Student
        fields = ["id","name","age","description","sex"]
        # fields = "__all__" # 表示操做模型中的全部字段

      exclude = ['sex']
      # 使用exclude能够明确排除掉哪些字段

        read_only_fields = ('id')
        # 能够经过read_only_fields指明只读字段,即仅用于序列化输出的字段

        # 添加额外的验证选项
        extra_kwargs = {
            "sex":{"write_only":True,},
            "id":{"read_only":True,}
        }      

 

视图

请求与响应

request:REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。

经常使用属性:

  1.request.data返回解析以后的请求体数据,相似django中标准的request.POST

    特性:

      1.包含了解析以后的文件和非文件数据

      2.包含了对POST、PUT、PATCH请求方式解析后的数据

      3.利用了REST framework的parsers解析器,不只支持表单类型数据,也支持JSON数据

  2.request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已

 

response:REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。

 

两个基类视图

APIView:传入的是改动后的request

 

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

  属性:

    Serializer_class:指明视图使用的序列化器

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

  方法:

    1.get_serializer_class(self),返回序列化器类,默认返回serializer_class,能够重写(多个序列化器的时候)

     2.get_serializer(self,args,*kwargs),返回序列化器对象

     

    1.get_queryset(self),返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,能够重写

    2.get_object(self),返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。

 

五个视图扩展类

做用:

  提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,若是须要编写的视图属于这五种,则视图能够经过继承相应的扩展类来复用代码,减小本身编写的代码量。

这五个扩展类须要搭配GenericAPIView父类,由于五个扩展类的实现须要调用GenericAPIView提供的序列化器与数据库查询的方法。

 

使用:定义好get、post等方法,将视图扩展类提供的函数做为返回值

 

ListModelMixin

  列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。

  使用:

from rest_framework.mixins import ListModelMixin

class BookListView(ListModelMixin, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self, request):
        return self.list(request)

 

CreateModelMixin

  提供create(request, *args, **kwargs)方法快速实现建立资源的视图,成功返回201状态码。

若是序列化器对前端发送的数据验证失败,返回400错误。

 

RetrieveModelMixin

  提供retrieve(request, *args, **kwargs)方法,能够快速实现返回一个存在的数据对象。

若是存在,返回200, 不然返回404。

 

UpdateModelMixin

  提供update(request, *args, **kwargs)方法,能够快速实现更新一个存在的数据对象。

成功返回200,序列化器校验数据失败时,返回400错误。

  同时也提供partial_update(request, *args, **kwargs)方法,能够实现局部更新。

 

 

DestroyModelMixin

  提供destroy(request, *args, **kwargs)方法,能够快速实现删除一个存在的数据对象。

成功返回204,不存在返回404。

 

GenericAPIView的视图子类

1)CreateAPIView

提供 post 方法

继承自: GenericAPIView、CreateModelMixin

2)ListAPIView

提供 get 方法

继承自:GenericAPIView、ListModelMixin

3)RetrieveAPIView

提供 get 方法

继承自: GenericAPIView、RetrieveModelMixin

4)DestoryAPIView

提供 delete 方法

继承自:GenericAPIView、DestoryModelMixin

5)UpdateAPIView

提供 put 和 patch 方法

继承自:GenericAPIView、UpdateModelMixin

6)RetrieveUpdateAPIView

提供 get、put、patch方法

继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

7)RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法

继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

 

视图集

ViewSet视图集类再也不实现get()、post()等方法,而是实现动做 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动做与具体请求方式对应上。如:

class BookInfoViewSet(viewsets.ViewSet):

    def list(self, request):
        books = BookInfo.objects.all()
        serializer = BookInfoSerializer(books, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        try:
            books = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = BookInfoSerializer(books)
        return Response(serializer.data)

在设置路由时,咱们能够以下操做

urlpatterns = [
    url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
    url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]

在ViewSet中,没有提供任何动做action方法,须要咱们本身实现action方法。

相关文章
相关标签/搜索