Django REST Framework на примере блога
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
Какой командой установить Django REST Framework?
Добавьте DRF в INSTALLED_APPS (имя приложения — rest_framework).
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"rest_framework",
"blog.apps.BlogConfig",
]
Напишите сериализатор PostSerializer на основе serializers.ModelSerializer для модели Post
с полями id, title, slug, author, body, publish.
from rest_framework import serializers
from ..models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ["id", "title", "slug", "author", "body", "publish"]
Напишите два представления на generic-классах DRF: PostListView (generics.ListAPIView)
и PostDetailView (generics.RetrieveAPIView). Оба — с queryset = Post.published.all()
и serializer_class = PostSerializer.
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
По какому параметру URL RetrieveAPIView ищет объект по умолчанию?
Что такое Browsable API в DRF?
Войдите, чтобы отмечать пройденные уроки.