Django 5 для начинающих

Прогресс по курсу:  9/1004

8.4 Представления
3 из 4 шагов пройдено
0 из 5 баллов  получено

Миксины

Классы 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().


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Ничего не понятно...слишком поверхностные шаги в этом уроке.

@Anonymous_450292901, напишите поподробнее, что именно не понятно, постараемся исправить это в лекции, добавим материал.

@Илья_Перминов, во многих метсах в том числе и тут не хватает какой-то простой формулировки или схемы. Как-будто нужно чтобы понимающий эту тему человек объяснил своими словами на пальцах. Что куда зачем и почему) Я уже в целом привык, и переодически понимания сами находят меня, но это всегда штурм крепости неизвестной высоты. А вот если сразу обозначить главное, было бы проще)

@Никита_Ильин, я думаю что мы ДРФ посвятим отдельный курс, уже поняли что краткое изложение не всем понятно.

Несколько неожиданно, что и для списковых, и "единичных" вью используется одинаковый queryset

По идее для единичного объекта должен быть предусмотрен способ получения этого единичного объекта. Хотя, если подумать, с учетом lazy подхода, наложенные с помощью filter() условия дадут примерно тот же SQL запрос...

@ilya_kutaev, На первый взгляд кажется, что мы выбираем все записи и их список будет отправляться клиенту. Однако, всегда следует помнить, что запросы в Django по умолчанию ленивые, т.е. выполняются не сразу, а в момент, когда происходит первая попытка обращения к ним. Благодаря этому, запрос для queryset может быть модифицирован с помощью миксинов, прежде чем будут получены какие-либо записи.

@Илья_Перминов, Спасибо! Так и предположил, что спасает lazy подход (по сути лень), как и людей, кстати, от множества бессмысленных телодвижений )))

Изменен ilya kutaev

Интересно, если мы наследуемся от mixins, то ожидал что функционал .list .create и т.п. будет доступен. А тут надо явно его прописывать. Если не переопределить то методы не доступны. 

Method {type_method} not allowed

 PS: по мне странное поведение явного определение методов. Или тут есть ньюансы?

@Антон_Глухенко, а как вы пытаетесь использовать функционал .list, .create, я просто не совсем понял вопроса? API от нас ждет методы get, post, и мы переопределяем их, чтобы они использовали функционал миксинов.

@Илья_Перминов, извини, моя невнимательность, под вечер не правильно код прочитал. Первоначально показалось что в PostList переопределяются методы миксинов .list, .create, а не определяются .get, .post 

PS: по коду все норм, вопросов нет.