У світі Django REST Framework маршрутизація відповідає за те, як запити співставляються з обробниками або представленнями. Коли ми використовуємо View, маршрути визначаються вручну за допомогою path() або re_path() у файлі urls.py. Але з появою ViewSet ситуація стає складнішою: для одного ViewSet може знадобитися одразу кілька URL, які відповідають кожному з CRUD-методів (list, retrieve, create, update, delete). Ручне прописування всіх цих маршрутів стає невдячною роботою.
І тут з'являються Routers. Це спеціальний механізм у DRF, який автоматично генерує маршрути для ViewSet. Тобі потрібно лише зареєструвати ViewSet у Router, а решту зроблять магія DRF і гіперактивний маршрутогенератор.
Чому варто використовувати Routers?
- Менше коду, менше помилок. Не потрібно вручну прописувати маршрути, менше шансів зробити друкарську помилку.
- Стандартизація. Маршрути для API стають уніфікованими.
- Простота розширення. Додавання нових endpoint займає кілька рядків коду.
Навіщо це потрібно?
Уявіть, ви створюєте API для управління завданнями (ToDo). У вас є модель Task, і ви хочете надати користувачам доступ:
- Список всіх завдань —
/tasks/(методlist). - Отримати одне завдання за ID —
/tasks/{id}/(методretrieve). - Створити нове завдання —
/tasks/(методcreate). - Оновити завдання —
/tasks/{id}/(методиupdateабоpartial_update). - Видалити завдання —
/tasks/{id}/(методdestroy).
З View ви б вручну прописували маршрути для кожної з цих дій, а потім зв'язували їх із відповідними представленнями. З ViewSet і Router процес спрощується: всі маршрути генеруються автоматично.
Як підключити Router до проєкту
Давайте розберемо, як на практиці налаштувати маршрутизацію з використанням Router.
Крок 1: імпортуємо Router
DRF надає два типи роутерів:
- SimpleRouter (більш гнучкий і простий).
- DefaultRouter (включає маршрут для кореневої сторінки API).
Про них ми поговоримо трохи пізніше, а поки давайте імпортуємо потрібний інструмент:
from rest_framework.routers import SimpleRouter
Крок 2: визначаємо ViewSet
Ми будемо працювати з моделлю Task. Для початку створимо ViewSet:
from rest_framework.viewsets import ModelViewSet
from .models import Task
from .serializers import TaskSerializer
class TaskViewSet(ModelViewSet):
"""
ViewSet для управління завданнями (Task).
"""
queryset = Task.objects.all()
serializer_class = TaskSerializer
Зверніть увагу, що ми використовуємо ModelViewSet, який автоматично реалізує логіку для CRUD-операцій. Завдяки цьому ViewSet підтримує методи:
list(GET/tasks/)retrieve(GET/tasks/{id}/)create(POST/tasks/)update(PUT/tasks/{id}/)destroy(DELETE/tasks/{id}/)
Крок 3: налаштовуємо маршрут з використанням Router
Тепер створимо Router і зареєструємо наш ViewSet:
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet
# Створюємо екземпляр Router
router = SimpleRouter()
# Реєструємо ViewSet
router.register(r'tasks', TaskViewSet, basename='task')
# Підключаємо маршрути Router у проєкті
urlpatterns = router.urls
Що тут сталося?
- Створено екземпляр
SimpleRouter. - Ми зареєстрували наш
TaskViewSetпід маршрутомtasks. Це означає, що DRF автоматично створить маршрути для всіх дій, які підтримує ViewSet. - Після реєстрації доступні всі маршрути для дій CRUD.
Крок 4: перевіряємо маршрути
Для перевірки відкрийте консоль і виконайте команду:
python manage.py show_urls
Ви побачите результат такого вигляду:
Endpoint | Method | Action
--------------------------------------------------
/tasks/ | GET | list
/tasks/ | POST | create
/tasks/{id}/ | GET | retrieve
/tasks/{id}/ | PUT | update
/tasks/{id}/ | DELETE | destroy
Це і є маршрути, згенеровані автоматично завдяки Router.
Як підключити Router у основному urls.py
На практиці зазвичай Routerи визначають у urls.py кожного додатку, а потім включають їх у головний файл маршрутів проєкту. Наприклад:
У tasks/urls.py:
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet
router = SimpleRouter()
router.register(r'tasks', TaskViewSet, basename='task')
urlpatterns = router.urls
У головному urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('tasks.urls')), # Підключаємо маршрути додатку tasks
]
Тепер ваш API доступний за URL, що починається з /api/tasks/.
Практична робота: додаємо маршрути в проєкт
Давайте спробуємо на практиці налаштувати маршрутизацію для моделі Category, яка пов'язується із завданнями. Припустімо, що у нас є наступна модель:
# models.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
Створимо ViewSet і підключимо його до маршрутизації.
# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Category
from .serializers import CategorySerializer
class CategoryViewSet(ModelViewSet):
"""
ViewSet для управління категоріями (Category).
"""
queryset = Category.objects.all()
serializer_class = CategorySerializer
Додаємо в Router
# urls.py
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet, CategoryViewSet
router = SimpleRouter()
router.register(r'tasks', TaskViewSet, basename='task')
router.register(r'categories', CategoryViewSet, basename='category') # Новий маршрут
urlpatterns = router.urls
Після цього автоматично згенеруються маршрути для категорій:
/categories/ | GET | list
/categories/ | POST | create
/categories/{id}/ | GET | retrieve
/categories/{id}/ | PUT | update
/categories/{id}/ | DELETE | destroy
Типові помилки
Відсутність параметра
basenameуregister(). Якщо не вказатиbasename, DRF спробує автоматично визначити його на основі моделі. Це призводить до помилок, якщо у вашого ViewSet немає атрибутаqueryset.Дублюючі маршрути. Якщо випадково зареєструвати кілька ViewSet з однаковим базовим маршрутом (
tasks), це викличе конфлікт.Неправильна структура файлів. Переконайтеся, що маршрути реєструються у правильному
urls.pyі ієрархія додатків організована коректно.
Заключні слова (але не висновок)
У цій лекції ми навчилися використовувати Router для автоматичної генерації маршрутів у Django REST Framework. Це значно спрощує роботу, підвищує читабельність коду і робить API більш стандартизованим. У наступній лекції ми заглибимося в порівняння SimpleRouter і DefaultRouter та навчимося їх кастомізувати. Інструментальні барабани налаштовуються, чекаємо вас на наступному занятті!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ