JavaRush /Курси /Модуль 3: Django /Використання APIView та ViewSet

Використання APIView та ViewSet

Модуль 3: Django
Рівень 16 , Лекція 8
Відкрита

Переходимо на наступний рівень. Тепер ми будемо розбиратися з двома найважливішими інструментами DRF — APIView та ViewSet. Ці інструменти формують основу для обробки запитів до вашого API. Ми розберемо, що вони собою являють, у чому їхні відмінності та як їх ефективно використовувати.

Що таке APIView?

APIView — це базовий клас представлень Django REST Framework.
Він додає додаткову функціональність поверх стандартного Django View. Цей клас дозволяє працювати з API, які обробляють запити JSON, а також спрощує написання логіки для різних HTTP-методів.

Основні особливості APIView:

  • Підтримує стандартні HTTP-методи (GET, POST, PUT, DELETE тощо).
  • Автоматично перетворює дані у формат JSON.
  • Дозволяє кастомізувати обробку запитів та відповідей.
  • Зберігає гнучкість, залишаючи вам повний контроль над діями.

Приклад: створення API з використанням APIView

Давайте створимо просте API для моделі Article:

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

Тепер створимо представлення для цієї моделі:

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer

class ArticleAPIView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ось що відбувається:

  • Метод get() повертає список усіх статей.
  • Метод post() обробляє створення нових статей.

Маршрути для APIView налаштуємо наступним чином:

# urls.py
from django.urls import path
from .views import ArticleAPIView

urlpatterns = [
    path('articles/', ArticleAPIView.as_view(), name='article-list'),
]

Запустіть сервер і відкрийте /articles/. Вітаю, ви щойно створили API з використанням APIView!

Що таке ViewSet?

Якщо APIView — це гнучкість і контроль, то ViewSet — це автоматизація та зручність. ViewSet об'єднує логіку для декількох HTTP-методів (GET, POST, PUT, DELETE і т.д.) в одному класі.

Переваги ViewSet:

  • Зменшує кількість шаблонного коду.
  • Легше інтегрується з маршрутизаторами (Routers).
  • Автоматизує створення CRUD-операцій.

Приклад: створення API з використанням ViewSet

Той самий API для моделі Article, але цього разу з використанням ViewSet:

# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

Все! Так, це все! ModelViewSet вже включає логіку для всіх стандартних операцій (перегляд списку, деталей, створення, оновлення та видалення). Вам не потрібно вручну писати методи на кшталт get() або post().

Тепер маршрутизуємо це представлення:

# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet

router = DefaultRouter()
router.register(r'articles', ArticleViewSet, basename='article')

urlpatterns = [
    path('', include(router.urls)),
]

Відкрийте /articles/, і ви побачите автосгенеровані ендпоінти для всіх CRUD-операцій. DRF навіть надасть тестовий інтерфейс для запитів. Магія, чи не так?

Порівняння APIView та ViewSet

Тепер, коли ми познайомилися з обома інструментами, давайте розберемо їх відмінності:

Особливість APIView ViewSet
Контроль Максимальний: ви самі пишете логіку Частковий: логіка автоматизована
Обсяг коду Більше: кожен метод пишеться вручну Менше: CRUD-операції включені
Маршрути Налаштовуються вручну Автоматично через Routers
Гнучкість Підходить для кастомних сценаріїв Ідеальний для стандартних операцій
Простота розробки Більше зусиль Швидший старт для CRUD

Використовуйте APIView, якщо ви хочете повний контроль над тим, що відбувається в кожному HTTP-методі. Це корисно, наприклад, якщо вам потрібно додати складну логіку або обробити нестандартні запити.

А ViewSet стане вашим найкращим другом, якщо ви швидко налаштовуєте стандартний набір CRUD-операцій.

Коли використовуємо APIView, а коли — ViewSet?

  1. APIView:

    • Якщо ваші операції нестандартні і не вкладаються в CRUD.
    • Якщо потрібен повний контроль над кожним етапом обробки HTTP-запитів.
    • Якщо ви хочете додавати детальну логіку в методи (наприклад, складні перевірки).
  2. ViewSet:

    • Для базових CRUD-операцій, які відповідають RESTful архітектурі.
    • Для швидкого та зручного створення стандартного API.
    • Коли важливо мінімізувати шаблонний код і зосередитися на функціональності.

Практика: створення API з ViewSet

Давайте потренуємося. Уявіть, що вам потрібно створити API для керування користувачами. У нас вже є модель User. Ми створимо ViewSet для неї та підключимо маршрутизацію.

# serializers.py
from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email']
# views.py
from rest_framework.viewsets import ModelViewSet
from django.contrib.auth.models import User
from .serializers import UserSerializer

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet

router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')

urlpatterns = [
    path('', include(router.urls)),
]

Відкрийте /users/, і voilà — у вас є повнофункціональний API для керування користувачами.

Загальні помилки та тонкощі використання

Одна з поширених помилок при роботі з APIView — забути використовувати метод .data у серіалізатора для отримання даних. Це часто призводить до того, що ви випадково повертаєте об'єкт серіалізатора замість JSON.

З ViewSet часта помилка — неправильна реєстрація маршрутів. Не забудьте додати basename у router.register(), якщо ваш ViewSet не використовує queryset напряму.

Також важливо пам'ятати, що ViewSet — це потужний інструмент, але його автоматизація може не підходити для складної логіки. Якщо ви відчуваєте, що пишете багато кастомних методів всередині ViewSet, можливо, варто повернутися до використання APIView.

Ось так, крок за кроком, ми вивчаємо інструменти Django REST Framework. Тепер ви озброєні знаннями про APIView та ViewSet — обирайте інструмент під задачу та будуйте чудові API!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ