⚡ Топ-команды блока
pip install djangorestframework django-filter
# GenericAPIView атрибуты
queryset = Model.objects.all()
serializer_class = ModelSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
pagination_class = PageNumberPagination
# ViewSet + Router
router = DefaultRouter()
router.register(r'items', ItemViewSet)
urlpatterns = [path('', include(router.urls))]
# Soft Delete
def delete(self): self.is_deleted = True; self.save()
# Транзакция
with transaction.atomic(): ...
# Пагинация (settings)
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': '...', 'PAGE_SIZE': 10}
GenericAPIView — атрибуты
| Атрибут / метод | Тип | Назначение |
queryset | атрибут | Набор данных представления |
serializer_class | атрибут | Класс сериализатора |
filter_backends | атрибут | Список классов фильтрации |
pagination_class | атрибут | Класс пагинации |
lookup_field | атрибут | Поле модели для поиска (default: 'pk') |
lookup_url_kwarg | атрибут | Параметр URL для lookup_field |
get_queryset() | метод | Переопределить для динамической фильтрации |
get_object() | метод | Получить один объект; бросает 404 при отсутствии |
get_serializer_class() | метод | Разные сериализаторы для разных методов |
get_serializer() | метод | Создать экземпляр сериализатора |
get_serializer_context() | метод | Передать дополнительные данные сериализатору |
filter_queryset(qs) | метод | Применить filter_backends к queryset |
paginate_queryset(qs, request) | метод | Разбить queryset на страницы |
Generic Views — шпаргалка выбора
| Задача | Класс |
| Получить список | ListAPIView |
| Создать объект | CreateAPIView |
| Получить один объект | RetrieveAPIView |
| Обновить объект | UpdateAPIView |
| Удалить объект | DestroyAPIView |
| Список + создание | ListCreateAPIView |
| Чтение + обновление | RetrieveUpdateAPIView |
| Чтение + удаление | RetrieveDestroyAPIView |
| Чтение + обновление + удаление | RetrieveUpdateDestroyAPIView |
ViewSets — шпаргалка
| ViewSet | Действия |
ModelViewSet | list, create, retrieve, update, partial_update, destroy |
ReadOnlyModelViewSet | list, retrieve |
GenericViewSet | задаётся миксинами вручную |
Декоратор @action
| Параметр | Тип | Значение |
detail | bool | True — /items/{pk}/action/, False — /items/action/ |
methods | list | HTTP-методы: ['get'], ['post', 'put'] |
url_path | str | Кастомный суффикс URL |
url_name | str | Кастомное имя маршрута |
Router — URL-схема
| URL | Метод | Действие ViewSet |
/items/ | GET | list |
/items/ | POST | create |
/items/{pk}/ | GET | retrieve |
/items/{pk}/ | PUT | update |
/items/{pk}/ | PATCH | partial_update |
/items/{pk}/ | DELETE | destroy |
filter_backends — параметры запроса
| Backend | Атрибут на классе | Параметр запроса | Пример |
DjangoFilterBackend | filterset_fields | ?field=value | ?author=Fitzgerald |
SearchFilter | search_fields | ?search=term | ?search=Gatsby |
OrderingFilter | ordering_fields | ?ordering=field | ?ordering=-price |
Пагинация — параметры запроса
| Класс | Параметры | Пример |
PageNumberPagination | ?page=N&page_size=N | ?page=2&page_size=10 |
LimitOffsetPagination | ?limit=N&offset=N | ?limit=5&offset=10 |
CursorPagination | ?cursor=... | ?cursor=bz0x... |
Установка зависимостей
pip install djangorestframework
pip install django-filter
# settings.py
INSTALLED_APPS = [
'rest_framework',
'django_filters',
]
Миграции и запуск
python manage.py makemigrations
python manage.py migrate
python manage.py runserver