JavaRush /Курси /Модуль 3: Django /Різниця між ModelSerializer і Serializer

Різниця між ModelSerializer і Serializer

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

Отже, серіалізація. Думаємо, ти ще не забув, що так називається процес пакування (і розпакування) даних, щоб їх можна було або передати клієнту (наприклад, у форматі JSON), або зберегти в базі даних. Django REST Framework надає два основних інструменти для цього: Serializer і ModelSerializer. І хоча їхні назви майже однакові, цілі та застосовність у них трохи різні.

Сьогодні ми зануримося у відмінності між цими двома інструментами. Ми побачимо, як вони працюють, розберемо, в яких випадках їх застосовувати, і, звісно, розглянемо приклади коду.

Розбираємося з Serializer

Serializer — це базовий інструмент у DRF для перетворення даних. Він працює, як ручний конструктор: ви самі визначаєте, які поля будуть серіалізуватися, в якому форматі, як вони будуть валідовуватися та оброблятися.

Давайте розберемо це на прикладі та створимо Serializer. Припустимо, у нас є модель Article, яка описує статті блогу. Вона виглядає так:

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

Тепер створимо серіалізатор для цієї моделі, використовуючи Serializer.

# serializers.py
from rest_framework import serializers

class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()
    author = serializers.CharField(max_length=50)
    created_at = serializers.DateTimeField(read_only=True)

    def create(self, validated_data):
        # Створюємо новий об'єкт Article
        return Article.objects.create(**validated_data)

    def update(self, instance, validated_data):
        # Оновлюємо дані існуючого об'єкта Article
        instance.title = validated_data.get('title', instance.title)
        instance.content = validated_data.get('content', instance.content)
        instance.author = validated_data.get('author', instance.author)
        instance.save()
        return instance

Тут ми вручну визначили поля, які серіалізуються, а також методи create і update, які описують, як створювати і оновлювати об'єкти.

Плюси Serializer:

  1. Повний контроль над процесом серіалізації.
  2. Гнучкість у налаштуванні валідації та обробки даних.
  3. Можна використовувати для даних, які не пов'язані з моделями Django.

Мінуси Serializer:

  1. Великий обсяг повторюваного коду.
  2. Менш зручний для роботи з моделями Django.

Розбираємось з ModelSerializer

Якщо Serializer — це ручний інструмент, то ModelSerializer — це автоматична коробка передач. Він створений спеціально для роботи з моделями Django. Завдяки йому можна автоматично генерувати сериалізатори на основі визначеної моделі.

Для тієї ж моделі Article код з використанням ModelSerializer виглядає значно компактніше:

# serializers.py
from rest_framework import serializers
from .models import Article

class ArticleModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['title', 'content', 'author', 'created_at']

Ось і все! Не потрібно вручну визначати поля чи писати методи create і update. DRF подбає про це за вас.

Плюси ModelSerializer:

  1. Мінімум коду. Все, що вам потрібно — вказати модель і список полів.
  2. Автоматична інтеграція з моделлю. Методи create і update вже реалізовані.
  3. Простота використання для типових CRUD операцій.

Мінуси ModelSerializer:

  1. Обмежена гнучкість (за замовчуванням генерується лише мінімально необхідний функціонал).
  2. Підходить лише для роботи з моделями Django.

Порівняння Serializer та ModelSerializer

Давайте більш наочно представимо відмінності між цими двома підходами:

Критерій Serializer ModelSerializer
Гнучкість Дозволяє вручну задавати поля, логіку серіалізації та валідації Автоматично генерує поля та базову логіку на основі моделі.
Простота використання Вимагає більше коду: вручну визначаються поля, методи create та update Мінімум коду: лише вказати модель та список полів.
Зв'язок із моделями Django Може використовуватися для даних, які не пов'язані з моделями Django Призначений виключно для роботи з моделями Django.
Продуктивність Може потребувати більше ресурсів через ручний опис логіки Використовує оптимізацію, вбудовану в DRF, але обмежений моделлю.
Сценарії використання Підходить для довільних даних (наприклад, для зовнішніх API) Підходить для типових CRUD операцій на основі Django моделей.

Коли використовувати Serializer, а коли ModelSerializer?

Тепер давай з'ясуємо, в яких випадках краще використовувати той чи інший інструмент. Якщо коротко, якщо тобі потрібно обробляти дані, які не пов'язані з моделлю Django (наприклад, дані з форми або зовнішнього API), використовуй Serializer. Він дозволяє максимально гнучко налаштувати поля та логіку валідації. Ну а якщо ти працюєш з Django моделями і хочеш швидко створити CRUD API, то твій вибір — ModelSerializer. Цей інструмент чудово підходить для автоматизації рутинної роботи.

Тобто Serializer — це твій універсальний програмний швейцарський ножик, а ModelSerializer — зручна викрутка для конкретного набору операцій.

Поєднуємо теорію з практикою

Давай створимо API для нашої моделі Article, використовуючи обидва підходи.

Приклад з Serializer

# 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 ArticleList(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)

Приклад з ModelSerializer

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

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

ModelViewSet + ModelSerializer скоротять твій код буквально до кількох рядків, але обидва підходи приведуть до одного й того ж результату: працюючого API для твоєї моделі.

Типові помилки та підводні камені

Спочатку з серіалізаторами легко заплутатись. Наприклад, якщо ти працюєш з ModelSerializer, але хочеш додати додаткове поле, не пов’язане з моделлю, ти можеш забути налаштувати його. Ось як це виправити:

class ArticleModelSerializer(serializers.ModelSerializer):
    extra_field = serializers.CharField(write_only=True)

    class Meta:
        model = Article
        fields = ['title', 'content', 'author', 'created_at', 'extra_field']

З Serializer інша проблема — ти можеш забути реалізувати create або update, через що твої дані не будуть зберігатись. Завжди перевіряй, що твої методи працюють, використовуючи тести або консоль Django.

Практичне завдання

  1. Створіть модель для управління коментарями до статей (наприклад, модель Comment).
  2. Реалізуйте API для цієї моделі двома способами:
    • З використанням Serializer.
    • З використанням ModelSerializer.
  3. Порівняйте обсяг коду та зручність кожного підходу.

На цьому етапі ви маєте розуміти, як використовувати обидва типи серіалізаторів, і усвідомлювати, який інструмент краще підходить для вашого завдання. 🚀

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