序列化器:
做用:前端
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方法。