В прошлых шагах мы рассмотрели работу представлений на основе класса APIView и на основе миксинов, но разработчики Django REST Framework упростили определения классов представлений.
В DRF существует несколько предопределенных базовых классов, о которых подробно можно почитать на следующей странице официальной документации:
CreateAPIView– создание данных по POST-запросу;
ListAPIView– чтение списка данных по GET-запросу;
RetrieveAPIView– чтение конкретных данных (записи) по GET-запросу;
DestroyAPIView– удаление данных (записи) по DELETE-запросу;
UpdateAPIView– изменение записи по PUT или PATCH-запросу;
ListCreateAPIView– для чтения (по GET-запросу) и создания списка данных (по POST-запросу);
RetrieveUpdateAPIView– чтение и изменение отдельной записи (GET, PUT и PATCH-запросы);
RetrieveDestroyAPIView– чтение (GET-запрос) и удаление (DELETE-запрос) отдельной записи;
RetrieveUpdateDestroyAPIView– чтение, изменение и добавление отдельной записи (GET, PUT, PATCH и DELETE-запросы).
Чтобы использовать общие представления на основе классов, классы представлений должны импортироваться из rest_framework.generics.
А теперь давайте переделаем представления списка и детальной информации, чтобы извлекать объекты Post. Внутри каталога /blog_api/ откройте views.py. Добавьте в него следующий ниже исходный код:
from rest_framework import generics
from blog.models import Post
from .serializers import PostSerializer
class PostList(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
В приведенном выше исходном коде используются типовые представления ListCreateAPIView и RetrieveUpdateDestroyAPIView фреймворка REST. URL-параметр pk вставлен в представление детальной информации, чтобы извлекать объект по данному первичному ключу.
Оба представления имеют следующие атрибуты:
queryset: базовый набор запросов QuerySet, используемый для извлечения объектов;
serializer_class: класс сериализации объектов.
Основные настройки:
Следующие атрибуты контролируют основное поведение.
-
queryset- Набор запросов, который следует использовать для возврата объектов с этого вида. Как правило, вы должны либо установить этот атрибут, либо переопределитьget_queryset()метод.
-
serializer_class- Класс сериализатора, который должен использоваться для проверки и десериализации ввода, а также для сериализации вывода.
-
lookup_field- модельное поле, которое следует использовать для выполнения поиска объектов отдельных экземпляров модели. По умолчанию'pk'. Обратите внимание, что при использовании гиперссылочных API вам необходимо убедиться, что как просмотры API, так и классы сериализаторов задавали поля поиска, если вам нужно использовать пользовательские значения.
-
lookup_url_kwarg- Аргумент по ключевому слову URL, который следует использовать для поиска объекта. URL-контент должен включать аргумент по ключевому слову, соответствующий этому значению. Если это не установлено, это дефолт использует то же значение, что иlookup_field.
Пагинация:
Следующие атрибуты используются для управления пагинацией при использовании с учетом представлений списка.
pagination_class- Класс пагинации, который следует использовать при пагинации списков.
По умолчанию для того же значения, что иDEFAULT_PAGINATION_CLASSнастройки, которая являетсяrest_framework.pagination.PageNumberPagination. Настройка сайтаpagination_class=Noneотключит пагинацию с этой точки зрения.
Фильтрация , фильтрующая:
filter_backends- Список классов бэкэнда фильтра, которые должны использоваться для фильтрации набора запросов. По умолчанию для того же значения, что иDEFAULT_FILTER_BACKENDS.
Вы можете заметить, что нам удалось избежать огромного количества шаблонного кода. Эти общие представления сочетают в себе повторно используемые элементы поведения из классов миксинов.
В этом разделе мы рассмотрели различные типы представлений на основе классов, предоставляемые Django REST Framework.
Мы реализовали представления с помощью APIView и объяснили различные типы классов миксинов.
Наконец, мы показали различные типы универсальных представлений на основе классов и продемонстрировали, как они позволяют избежать огромного количества шаблонного кода.