前言
mixins
翻譯成中文是混入,元件的意思。在DRF
中,針對獲取列表,檢索,建立等操作,都有相應的mixin
,一般我們自定義建立的類檢視都會繼承自GenericAPIView
和Mixins
一起使用
mixins工具集
mixins.py
檔案中有5個類,分別是
CreateModelMixin
:類中有個create
方法,相當於單增ListModelMixin
:類中有個list
方法,相當於群查RetrieveModelMixin
:類中有個`retrieve方法,相當於單查UpdateModelMixin
:類中有個update
和partial_update
2個方法,相當於單整體改和單區域性改DestroyModelMixin
:類中有個destroy
方法,相當於單刪
接下來我們自定義檢視類,繼承自這5個工具類和GenericAPIView
:
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class StudentsGenericView(mixins.ListModelMixin, mixins.CreateModelMixin,
mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
mixins.DestroyModelMixin, GenericAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 單查
def get(self, request, *args, **kwargs):
pk = kwargs.get("pk")
if pk:
response = self.retrieve(request, *args, **kwargs)
else:
response = self.list(request, *args, **kwargs)
return APIResponse(results=response.data)
# 單增
def post(self, request, *args, **kwargs):
response = self.create(request, *args, **kwargs)
return APIResponse(results=response.data)
# 單整體改
def put(self, request, *args, **kwargs):
response = self.update(request, *args, **kwargs)
return APIResponse(results=response.data)
# 單區域性改
def patch(self, request, *args, **kwargs):
response = self.partial_update(request, *args, **kwargs)
return APIResponse(results=response.data)
# 單刪
def delete(self, request, *args, **kwargs):
response = self.destroy(request, *args, **kwargs)
return APIResponse(results=response.data)
以上我們通過繼承GenericAPIView
,可以設定queryset
以及serializer_class
,那麼檢視函式就知道你是要針對哪個模型做處理,你的序列化的類是什麼了。接著我們繼承mixins
的5個工具類,這樣StudentList
就擁有了獲取列表,以及建立資料的功能。
以下方法由mixin
類提供,並提供物件儲存或刪除行為的簡單重寫。
perform_create(self, serializer)
- 在儲存新物件例項時由CreateModelMixin
呼叫。perform_update(self, serializer)
- 在儲存現有物件例項時由UpdateModelMixin
呼叫。perform_destroy(self, instance)
- 在刪除物件例項時由DestroyModelMixin
呼叫。
這些鉤子對於設定請求中隱含的但不是請求資料的一部分的屬性特別有用。例如,你可以根據請求使用者或基於URL
關鍵字引數在物件上設定屬性。
def perform_create(self, serializer):
serializer.save(user=self.request.user)
這些可重寫的關鍵點對於新增在儲存物件之前或之後發生的行為(例如通過電子郵件傳送確認或記錄更新日誌)也特別有用。
def perform_update(self, serializer):
instance = serializer.save()
send_email_confirmation(user=self.request.user, modified=instance)
你還可以使用這些鉤子通過丟擲 ValidationError()
來提供額外的驗證。當你需要在資料庫儲存時應用一些驗證邏輯時,這會很有用。 例如:
def perform_create(self, serializer):
queryset = SignupRequest.objects.filter(user=self.request.user)
if queryset.exists():
raise ValidationError('You have already signed up')
serializer.save(user=self.request.user)