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. Сравните объем кода и удобство каждого подхода.

На этом этапе вы должны понимать, как использовать оба типа сериализаторов, и осознавать, какой инструмент лучше подходит для вашей задачи. 🚀

1
Задача
Модуль 3: Django, 16 уровень, 5 лекция
Недоступна
Автоматизация с использованием ModelSerializer
Автоматизация с использованием ModelSerializer
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ