Django REST Framework на примере блога

⏱ 25 мин · 🧩 заданий: 6

Django REST Framework

DRF — самая популярная библиотека для создания API на Django. Она даёт:

  • сериализаторы — преобразование моделей в JSON и обратно с валидацией;
  • представления — от низкоуровневых APIView до наборов ViewSet, которые делают весь CRUD;
  • роутеры — автоматические маршруты;
  • аутентификацию (сессии, токены, JWT), права доступа, фильтрацию, пагинацию, ограничение частоты запросов;
  • Browsable API — удобный веб-интерфейс для API;
  • схемы и документацию.

Установка

pip install djangorestframework
INSTALLED_APPS = [
    ...
    "rest_framework",
    "blog.apps.BlogConfig",
]

Общие настройки DRF собираются в одном словаре (будем дополнять его в следующих уроках):

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticatedOrReadOnly",
    ],
}

Структура

Код API удобно держать в отдельном пакете внутри приложения:

blog/
└── api/
    ├── __init__.py
    ├── serializers.py
    ├── views.py
    └── urls.py

Сериализатор

Сериализация — превращение объекта Python (модели) в формат для передачи (JSON). Десериализация — обратный процесс, с проверкой данных.

blog/api/serializers.py:

from rest_framework import serializers

from ..models import Post


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["id", "title", "slug", "author", "body", "publish"]

ModelSerializer — аналог ModelForm: поля и валидация строятся по модели.

Попробуем в shell:

>>> from blog.models import Post
>>> from blog.api.serializers import PostSerializer
>>> post = Post.published.first()
>>> PostSerializer(post).data
{'id': 1, 'title': 'Первый пост', 'slug': 'pervyj-post', 'author': 1, 'body': '...', 'publish': '2026-10-25T10:00:00+03:00'}
>>> PostSerializer(Post.published.all(), many=True).data
[...]

many=True — для списка объектов. Обратите внимание: автор выводится как id — в следующем уроке научимся показывать его имя.

Представления

blog/api/views.py:

from rest_framework import generics

from ..models import Post
from .serializers import PostSerializer


class PostListView(generics.ListAPIView):
    queryset = Post.published.all()
    serializer_class = PostSerializer


class PostDetailView(generics.RetrieveAPIView):
    queryset = Post.published.all()
    serializer_class = PostSerializer

Generic-классы DRF работают как generic views Django: указали набор и сериализатор — получили готовый endpoint.

Маршруты

blog/api/urls.py:

from django.urls import path

from . import views

app_name = "blog_api"

urlpatterns = [
    path("posts/", views.PostListView.as_view(), name="post_list"),
    path("posts/<int:pk>/", views.PostDetailView.as_view(), name="post_detail"),
]

mysite/urls.py:

path("api/", include("blog.api.urls", namespace="api")),

Browsable API

Откройте http://127.0.0.1:8000/api/posts/ в браузере. DRF покажет не голый JSON, а удобную страницу: данные, заголовки ответа, разрешённые методы, а для методов записи — форму отправки. Это Browsable API — отличный инструмент разработки.

Чистый JSON можно получить из curl или добавив ?format=json:

curl http://127.0.0.1:8000/api/posts/
[
  {"id": 3, "title": "Шаблоны", "slug": "shablony", "author": 1, "body": "...", "publish": "2026-10-20T12:00:00+03:00"},
  {"id": 1, "title": "Первый пост", "slug": "pervyj-post", "author": 1, "body": "...", "publish": "2026-10-10T09:00:00+03:00"}
]

Request и Response DRF

Внутри DRF-представлений:

  • request.data — разобранное тело запроса (JSON, форма, файлы) для POST/PUT/PATCH;
  • request.query_params — параметры адреса (аналог request.GET);
  • Response(data, status=...) — ответ, который DRF отрисует в нужном формате (JSON или Browsable API).

Итог

  • DRF устанавливается как приложение rest_framework, настройки — в словаре REST_FRAMEWORK.
  • Сериализатор превращает модели в JSON и обратно, ModelSerializer — аналог ModelForm.
  • ListAPIView и RetrieveAPIView — список и один объект за пару строк.
  • Browsable API позволяет изучать и тестировать API прямо в браузере.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Ввод ответа

Какой командой установить Django REST Framework?

Задание 2 Написать код

Добавьте DRF в INSTALLED_APPS (имя приложения — rest_framework).

Задание 3 Написать код

Напишите сериализатор PostSerializer на основе serializers.ModelSerializer для модели Post с полями id, title, slug, author, body, publish.

Задание 4 Написать код

Напишите два представления на generic-классах DRF: PostListView (generics.ListAPIView) и PostDetailView (generics.RetrieveAPIView). Оба — с queryset = Post.published.all() и serializer_class = PostSerializer.

Задание 5 Один вариант ответа

По какому параметру URL RetrieveAPIView ищет объект по умолчанию?

Задание 6 Один вариант ответа

Что такое Browsable API в DRF?

Войдите, чтобы отмечать пройденные уроки.