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方法。

相關文章
相關標籤/搜索