Django REST Framework: API на Django

Современный бэкенд часто отдаёт не HTML, а JSON для мобильных приложений и фронтенд-фреймворков. Django REST Framework превращает Django в мощный конструктор API.
Суть: DRF добавляет сериализаторы (модель ↔ JSON), ViewSets (CRUD одним классом) и роутеры (автогенерация URL). Это стандарт де-факто для REST API на Django.

Зачем отдельный фреймворк для API

Django отлично рендерит HTML, но современные приложения часто строятся иначе: бэкенд отдаёт данные в JSON, а отрисовкой занимается мобильное приложение или фронтенд на React/Vue. Для этого нужен слой, который аккуратно превращает модели в JSON и обратно, валидирует данные и строит REST-эндпоинты. Django REST Framework (DRF) — самый популярный такой инструмент.

Сериализаторы: модель ↔ JSON

Сердце DRF — сериализатор. Он переводит объекты Django в JSON (сериализация) и разбирает входящий JSON обратно в объекты с валидацией (десериализация). ModelSerializer строится из модели почти как ModelForm:

from rest_framework import serializers
from .models import Post

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

ViewSets и роутеры

ModelViewSet даёт весь CRUD (список, деталь, создание, обновление, удаление) одним классом. А роутер автоматически строит для него все URL — не нужно вручную писать пути:

from rest_framework import viewsets, routers

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

router = routers.DefaultRouter()
router.register("posts", PostViewSet)
# даёт: GET/POST /posts/, GET/PUT/DELETE /posts/{id}/

Связь компонентов:

HTTP JSON-запрос
      │
      ▼
  Router ── строит URL для ViewSet
      │
      ▼
  ViewSet ── выбирает действие: list/retrieve/create/update/destroy
      │
      ▼
  Serializer ── модель ↔ JSON, валидация
      │
      ▼
  Model/ORM ── база данных
      │
      ▼
  JSON-ответ

Как это работает под капотом

Сериализация — это маппинг объекта в словарь по списку полей, а десериализация — обратный разбор с проверкой. Языко-независимая логика, которую видно на чистом Python:

# Попробуй сам ▶ — сериализация и десериализация как в DRF
import json

fields = ["id", "title", "body"]            # Meta.fields

def serialize(obj):                          # объект → JSON
    return json.dumps({f: obj[f] for f in fields}, ensure_ascii=False)

def deserialize(raw):                         # JSON → объект + валидация
    data = json.loads(raw)
    errors = {}
    for f in fields:
        if f == "id":
            continue
        if not data.get(f):
            errors[f] = "обязательное поле"
    if errors:
        return None, errors
    return {f: data.get(f) for f in fields}, {}

post = {"id": 1, "title": "Django REST", "body": "Учим DRF"}
print("serialize:", serialize(post))

obj, err = deserialize('{"title": "Новый", "body": "текст"}')
print("deserialize ok:", obj, err)

obj2, err2 = deserialize('{"title": ""}')
print("deserialize bad:", obj2, err2)

DRF делает это полнее (типы полей, вложенные связи, права доступа), но суть — маппинг между объектом и JSON с валидацией на входе.

Права и аутентификация

API нужно защищать. DRF даёт классы прав (IsAuthenticated, IsAdminUser) и схемы аутентификации (токены, сессии, JWT через сторонние пакеты). Их указывают на ViewSet или глобально в настройках.

Async в современном Django

Отдельно упомянем актуальный тренд. Начиная с Django 4.1–5.2, ORM получил асинхронные методы (afilter, aget, acreate), а Django 5.2 добавил async-методы аутентификации. Под ASGI можно писать полностью асинхронные views для задач с большим вводом-выводом. Это не замена синхронному коду, а инструмент для специфичных нагрузок.

Частые ошибки

  • Писать API «вручную» через JsonResponse для всего. На объёме DRF экономит много кода и даёт валидацию.
  • Забыть указать права доступа. API окажется открытым всем.
  • Возвращать модель напрямую без сериализатора. Утечёт лишнее, не будет валидации.
  • Игнорировать пагинацию. Эндпоинт списка вернёт миллион записей одним ответом.

Best practices

  • Для REST API используйте DRF, а не самописные JSON-эндпоинты.
  • Перечисляйте поля сериализатора явно, не отдавайте всё подряд.
  • Настраивайте права доступа и пагинацию с самого начала.
  • Async применяйте точечно — там, где много ожидания ввода-вывода.

Итоги

Django REST Framework превращает Django в конструктор API: сериализаторы переводят модели в JSON и валидируют ввод, ViewSets дают CRUD одним классом, роутеры строят URL. Защищайте API правами и пагинацией. А async-возможности современного Django открывают дверь к высоконагруженным сценариям. На этом ваш путь по Django заложен — дальше только практика.

Проверьте себя
1. За что отвечает сериализатор в DRF?
AЗа маршрутизацию URL
BЗа перевод модели в JSON и обратно с валидацией
CЗа хранение паролей
DЗа запуск сервера
2. Что даёт ModelViewSet вместе с роутером?
AТолько список объектов
BВесь CRUD одним классом и автоматически сгенерированные URL
CЗамену базы данных
DHTML-шаблоны