一. 創建數據類 CreateModelMixin :
class CreateModelMixin:
"""
1. 接收前臺數據,前天的序列化對象,request.data是 QueryDict
如:<QueryDict: {'nickName': ['006'], 'item': ['運營數據可視化'], 'url': ['#']}>
2. 驗證序列化數據的有效性
3. 保存數據
4. 獲得請求頭
5. 返回狀態
Create a model instance.
"""
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
二。返回所有數據列表 ListModelMixin:
class ListModelMixin:
"""
1. 獲取 queryset ,通過 filter_queryset 進行過濾篩選
2. 對過濾篩選後的 queryset 進行分頁,返回分頁對象
3. 序列化,並返回序列化的數據
傳入一個queryset,分別過濾,分頁,序列化
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
# 分頁
page = self.paginate_queryset(queryset)
# 這個是分頁的序列化
if page is not None:
serializer = self.get_serializer(page, many=True)
# 下面是分頁返回的額外結果
return self.get_paginated_response(serializer.data)
# 這個是不分頁的序列化
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
三。傳入參數,返回某個數據對象 RetrieveModelMixin:
class RetrieveModelMixin:
"""
獲取對象,序列化
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
四。 傳入參數,更新數據對象 UpdateModelMixin:
class UpdateModelMixin:
"""
更新:
1. 獲取 kwargs 字典中 partial 的值,如果沒有,則返回False,有,則返回值
2. 獲取單個對象
3. 通過序列化,獲取單個對象的序列化對象
4. 判斷序列化對象的有效性
5. 更新數據
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
五。傳入參數,刪除某個數據對象 DestroyModelMixin
class DestroyModelMixin:
"""
刪除:
1. 獲取單個對象
2. 刪除對象
Destroy a model instance.
"""
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
instance.delete()