Джанго вид расширенный класс
При расширенном классе необходимо GenericAPIView
использовать расширенный внутренний класс, при вызове сериалайзер, используютget_serializer
Нужно настроить get
, post
и другие методы запроса, внутренняя реализация вызывает соответствующий метод , чтобы расширить класс.
A, Mixins вид подкласса
Роль:
Он обеспечивает несколько вид фоновый (удаление ресурсов данных было проверено) для обеспечения потока обработки, если вам нужно написать взгляды принадлежит этим пять, вы можете просмотреть повторное использование кода через наследование соответствующих классов расширения, уменьшить код, который я написал сумма.
Пять продлены необходимостью соответствовать GenericAPIView
родительскому классу, так как реализация пять класса расширений нужно вызвать GenericAPIView
метод с последовательностью запросов к базе данных при условии.
1,1 ListModelMixin
Расширение представления списка класса, предусмотрен list(request, *args, **kwargs)
способ быстро Просмотреть список 200 возвращает код состояния.
- Обеспечить
list
методы для достижения быстрого просмотра списка - Позвоните , чтобы
GenericAPIView
установить хороший набор результатов - Позвоните , чтобы
GenericAPIView
установить хороший сериалайзер
Это метод фильтрации данных и пейджинга.Mixin
list()
Источник:
from rest_framework.mixins import ListModelMixin
class ListModelMixin(object):
"""
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)
Например:
from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView
class BookListView(ListModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request):
return self.list(request)
1.2 CreateModelMixin
Создание вида класса расширения , который обеспечивает create(request, *args, **kwargs)
способ быстро реализовать свои ресурсы , чтобы создать представление, успешное возвращение 201 код состояния.
- Обеспечить
create(request, *args, **kwargs)
способ быстро добиться создания зрения ресурсов - Фактическая последовательность , созданная функцией
save
полного метода save
Призывы метод будет идти сериализовать'Screate
метод
Если последовательность отказа аутентификации передачи данных переднего конца, возвращает 400 об ошибке.
Источник:
from rest_framework.mixins import CreateModelMixin
class CreateModelMixin(object):
"""
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 {}
1,3 RetrieveModelMixin
Удлинитель детальный вид класса, предусмотрен retrieve(request, *args, **kwargs)
способ, он может быть реализован быстро вернуться к текущему объекту данных.
Если да, то вернуться к 200, в противном случае 404.
Источник:
from rest_framework.mixins import RetrieveModelMixin
class RetrieveModelMixin(object):
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
# 获取对象,会检查对象的权限
instance = self.get_object()
# 序列化
serializer = self.get_serializer(instance)
return Response(serializer.data)
Например:
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.generics import GenericAPIView
class BookDetailView(RetrieveModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
return self.retrieve(request)
1.4 UpdateModelMixin
Обновление класс расширения вида предусмотрен update(request, *args, **kwargs)
способ
- Он может быть реализован быстро обновить существующий объект данных.
- Он также предоставляет
partial_update(request, *args, **kwargs)
методы могут быть реализованы частичное обновление. - Внутренняя функция обновления вызывает десериализатор
save
метод save
Метод требует сериализатором поupdate
методу
200 успешное возвращение, когда проверка сериализатору данных не удается, возвращает 400 об ошибке.
Источник:
from rest_framework.mixins import UpdateModelMixin
class UpdateModelMixin(object):
"""
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)
1,5 DestroyModelMixin
Удалять View класс расширения предусмотрен destroy(request, *args, **kwargs)
способом, он может быть реализован быстро удалить существующий объект данных.
Успешное возвращение 204, 404 нет возврата.
Источник:
from rest_framework.mixins import DestroyModelMixin
class DestroyModelMixin(object):
"""
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()
Использование GenericAPIView
и расширенный класс представления , который реализует api
интерфейс, код:
"""GenericAPIView结合视图扩展类实现api接口"""
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixin
class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin):
# 本次视图类中要操作的数据[必填]
queryset = Student.objects.all()
# 本次视图类中要调用的默认序列化器[玄天]
serializer_class = StudentModelSerializer
def get(self, request):
"""获取多个学生信息"""
return self.list(request)
def post(self,request):
"""添加学生信息"""
return self.create(request)
from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView
class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
def get(self,request,pk):
"""获取一条数据"""
return self.retrieve(request,pk)
def put(self,request,pk):
"""更新一条数据"""
return self.update(request,pk)
def delete(self,request,pk):
"""删除一条数据"""
return self.destroy(request,pk)
Два, общий вид подкласс
2,1 CreateAPIView
Предоставлять post
методы
Наследуется от: GenericAPIView
`CreateModelMixin
2,2 ListAPIView
Предоставлять get
методы
Наследуется GenericAPIView
от: ,ListModelMixin
2,3 RetrieveAPIView
Предоставлять get
методы
Наследуется GenericAPIView
от: ,RetrieveModelMixin
2,4 DestoryAPIView
Предоставлять delete
методы
Наследуется GenericAPIView
от: ,DestoryModelMixin
2.5 UpdateAPIView
Предоставлено put
и patch
методы
Наследуется GenericAPIView
от: ,UpdateModelMixin
2,6 RetrieveUpdateAPIView
При условии get
, put
, patch
метод
Наследуется GenericAPIView
от: RetrieveModelMixin
,,UpdateModelMixin
2,7 RetrieveUpdateDestoryAPIView
Обеспечить get
, put
, patch
, delete
метод
Наследуется GenericAPIView
от: RetrieveModelMixin
, UpdateModelMixin
,,DestoryModelMixin