瞭解到 APIView
以後, 你能夠嘗試看下 GenericAPIView
的源碼, 導入路徑是:python
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
複製代碼
在源碼中能夠看到他是在 APIView
的一種拓展, 當你繼承這個視圖類撰寫自定義視圖的時候, 你能夠獲取如下幾個屬性:函數
queryset
:用於從該視圖返回查詢集對象, 必須設置此屬性或重寫 get_queryset()
方法, 若是要覆蓋視圖方法, 則必須進行調用 get_queryset()
而不是直接訪問此屬性serializer_class
:用於驗證輸入和反序列化輸出的序列化類, 必須設置此屬性或重寫 get_serializer_class()
方法。lookup_field
:用於執行單個模型實例的對象查找的模型字段, 默認爲 pk
lookup_url_kwarg
:用於對象查找的URL關鍵字參數#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAdminUser
from models import User
class MedusaSerializer(serializers.Serializer):
...
class MedusaView(GenericAPIView):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
固然, 可能在 APIView
上拓展了一些方法放咱們的 API 撰寫變得簡單, 而且富有規範性, 可是相比較而言, 他的存在更加推薦和 mixins
一塊兒使用,post
perform_create(self, serializer)
- CreateModelMixin 保存新對象實例時調用perform_update(self, serializer)
- UpdateModelMixin 保存現有對象實例時調用perform_destroy(self, instance)
- DestroyModelMixin 刪除對象實例時調用例如你在新建實例對象進行保存處理的時候還須要作其餘的處理, 你就能夠在 perform_create(self, serializer)
中對它進行重寫:url
def perform_create(self, serializer):
instance = serializer.save()
# 你須要作的其餘處理的函數, 或者代碼塊
...
複製代碼
你也能夠對更新的數據進行再次驗證, 引起 ValidationError()
異常:spa
def perform_update(self, serializer):
if 1 == 1:
raise ValidationError('我無論,我就是不讓你更新。')
serializer.save(user=self.request.user)
複製代碼
固然啦, 還有 ListModelMixin
來獲取數據集合的, RetrieveModelMixin
來獲取某一數據詳情的, 大多數的請求方式和請求內容都已經歸納了。rest
提供了 .list(request, *args, **kwargs)
方法, 用於查詢對象集合, 你也能夠重寫他的 list
方法實現你本身的返回體, 你也能夠對他進行數據分頁(分頁 將會在之後講解到), 當你查詢成功了, 將會返回 200 OK
的狀態碼給你:code
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, ListModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
提供 .create(request, *args, **kwargs)
方法, 該方法實現建立並保存模型的新實例對象, 若是成功建立對象則返回一個 201 Created
響應, 若是提供的用於建立對象的請求數據無效, 則會返回一個 400 Bad Request
響應, 並將錯誤詳細信息做爲響應的正文。orm
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, CreateModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
提供 .retrieve(request, *args, **kwargs)
方法, 該方法實如今響應中返回現有模型實例的詳情數據, 若是能夠檢索到對象, 則返回一個 200 OK
響應, 不然將返回 404 Not Found
。cdn
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, RetrieveModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
提供 .update(request, *args, **kwargs)
方法, 該方法實現更新並保存現有模型的實例, 還提供了一種 .partial_update(request, *args, **kwargs)
方法, 該方法與該 update
方法相似, 可是用於更新的全部字段都是可選的, 這樣能夠支持 HTTP PATCH
請求(做者在實際開發中, 會對 UpdateModelsMixin
從新定義, 刪除對 HTTP PATCH
請求方式的支持), 若是對象被更新, 它將返回一個 200 OK
響應, 若是提供的用於更新對象的請求數據無效, 則會返回 400 Bad Request
響應, 並將錯誤詳細信息做爲響應的主體。對象
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, UpdateModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
提供 .destroy(request, *args, **kwargs)
方法, 該方法實現刪除現有模型實例, 若是刪除對象成功則返回 204 No Content
響應, 不然將返回 404 Not Found
。
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import DestroyModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, DestroyModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
複製代碼
CreateAPIView
POST
請求方式GenericAPIView
, CreateModelMixin
ListAPIView
GET
請求方式GenericAPIView
, ListModelMixin
RetrieveAPIView
GET
請求方式GenericAPIView
, RetrieveModelMixin
DestroyAPIView
DELETE
請求方式GenericAPIView
, DestroyModelMixin
UpdateAPIView
PUT
和 PATCH
請求方式GenericAPIView
, UpdateModelMixin
ListCreateAPIView
GET
和 POST
請求方式GenericAPIView
, ListModelMixin
, CreateModelMixin
RetrieveUpdateAPIView
GET
、 PUT
和 PATCH
請求方式GenericAPIView
, RetrieveModelMixin
, UpdateModelMixin
RetrieveDestroyAPIView
GET
和 DELETE
請求方式GenericAPIView
, RetrieveModelMixin
, DestroyModelMixin
RetrieveUpdateDestroyAPIView
GET
、PUT
、PATCH
和 DELETE
請求方式GenericAPIView
, RetrieveModelMixin
, UpdateModelMixin
, DestroyModelMixin