Миксины
Классы Mixin позволяют нам создавать многократно используемые фрагменты поведения. Их можно импортировать из rest_framework.mixins. Давайте обсудим различные типы классов примесей:
-
ListModelMixin: предоставляет метод.list(request, *args, **kwargs)для вывода набора запросов. Если набор запросов заполнен, тело ответа содержит ответ200 OKс сериализованным представлением набора запросов. -
CreateModelMixin: предоставляет метод.create(request, *args, **kwargs)для создания и сохранения нового экземпляра модели. Если объект создан, тело ответа содержит ответ201 Createdс сериализованным представлением объекта. Если он недействителен, он возвращает ответ400 Bad Requestс подробностями ошибки. -
RetrieveModelMixin: предоставляет метод.retrieve(request, *args, **kwargs)для возврата существующего экземпляра модели в ответе. Если объект может быть получен, тело ответа содержит ответ200 OKс сериализованным представлением объекта. В противном случае он вернет404 Not Found. -
UpdateModelMixin: предоставляет метод.update(request, *args, **kwargs)для обновления и сохранения существующего экземпляра модели. Он также предоставляет метод.partial_update(request, *args, **kwargs)для частичного обновления и существующего экземпляра модели. Если объект обновлен, тело ответа содержит ответ200 OKс сериализованным представлением объекта. В противном случае будет возвращен ответ400 Bad Requestс подробной информацией об ошибке. -
DestroyModelMixin: предоставляет метод.destroy(request, *args, **kwargs)для удаления существующего экземпляра модели. Если объект удален, тело ответа имеет ответ204 No Content, в противном случае он вернет404 Not Found.
Создание представлений с помощью миксинов
Давайте посмотрим, как мы можем использовать классы Mixin. Мы можем переопределить наш код файла views.py на основе миксинов:
from rest_framework import mixins
from rest_framework import generics
from blog.models import Post
from .serializers import PostSerializer
class PostList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PostDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
Здесь класс GenericAPIView обеспечивает основную функциональность, и мы добавляем к нему классы примесей. Набор запросов и класс_сериализатора являются основными атрибутами класса GenericAPIView.
Атрибут queryset используется для возврата объектов из этого представления, а атрибут serializer_class используется для проверки, десериализации ввода и сериализации вывода.
В классе PostList мы используем классы примесей, которые предоставляют действия .list() и .create() и привязывают действия к методам get() и post().
В классе PostDetail мы используем классы примесей, которые предоставляют .retrieve(), .update(), .partial_update() и .destroy() и привязать действия к методам get(), put(), patch() и delete().