JavaRush /Курсы /Модуль 3: Django /Создание ModelSerializer

Создание ModelSerializer

Модуль 3: Django
17 уровень , 2 лекция
Открыта

В этой лекции мы разберёмся с ModelSerializer. Это такой подкласс Serializer, который создаётся специально для упрощения работы с моделями Django. Он автоматически генерирует поля на основе модели, с которой вы работаете, а также упрощает процесс валидации и сохранения данных.

Можно сказать, что обычный Serializer в DRF — это как ручная сборка мебели из IKEA (всегда нужно что-то доработать и подумать). А вот ModelSerializer напоминает уже готовую мебель. Только ножки прикрутить!

Преимущества ModelSerializer

  • Меньше кода: ModelSerializer автоматически определяет поля на основе модели, избавляя от необходимости описывать их вручную.
  • Обратная совместимость: он использует стандартные механизмы валидации и сохранения данных, предоставляемые Django.
  • Кастомизация: несмотря на автоматизацию, ModelSerializer позволяет переопределять и настраивать поля, методы и поведение.

ModelSerializer идеально подходит для работы с моделями Django, когда большинство данных можно обрабатывать автоматически на основе модели. Если вам нужно сериализовать данные, не связанные с моделью, используйте базовый Serializer.

Пример создания ModelSerializer

Давайте создадим простой пример, чтобы понять, как работает ModelSerializer.

Представим, что мы разрабатываем приложение для управления книгами. Вот как может выглядеть наша модель книги:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publication_date = models.DateField()
    isbn = models.CharField(max_length=13, unique=True)
    pages = models.PositiveIntegerField()
    cover = models.CharField(max_length=20, choices=[('HARD', 'Hardcover'), ('SOFT', 'Softcover')])
    language = models.CharField(max_length=2, choices=[('EN', 'English'), ('FR', 'French'), ('ES', 'Spanish')])

    def __str__(self):
        return self.title

Теперь мы реализуем ModelSerializer для нашей модели Book:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book  # Указываем модель, для которой создаётся сериализатор
        fields = '__all__'  # Автоматически включает все поля модели

Это всё! Мы только что создали полностью функциональный сериализатор для работы с данными модели Book.

Понятие Meta-класса

Класс Meta внутри ModelSerializer используется для определения конфигурации сериализатора. С его помощью вы можете указать:

  • Модель, к которой привязан сериализатор.
  • Поля модели, которые нужно включить или исключить.
  • Специальные настройки, такие как порядок сортировки (если применимо).

Полезные параметры Meta

Параметр Описание
model Указывает модель, на основе которой создаётся сериализатор.
fields Позволяет указать, какие поля модели будут включены в сериализатор (или использовать __all__).
exclude Поля модели, которые нужно исключить из сериализатора.
read_only_fields Поля, которые должны быть только для чтения.

Пример кастомизации:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['title', 'author', 'publication_date']  # Только эти поля будут сериализованы
        read_only_fields = ['publication_date']  # Поле 'publication_date' будет доступно только для чтения

Сохранение данных через ModelSerializer

ModelSerializer упрощает процесс сохранения данных в базу данных. Он автоматически использует методы модели, такие как save(), для создания и обновления объектов.

Пример использования BookSerializer для создания нового объекта:

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookCreateAPIView(APIView):
    def post(self, request):
        serializer = BookSerializer(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)

Этот код проверяет входящие данные и, если они валидны, создаёт новый объект книги в базе данных.

Мы можем аналогично использовать сериализатор для обновления уже существующего объекта:

class BookUpdateAPIView(APIView):
    def put(self, request, pk):
        book = Book.objects.get(pk=pk)  # Получаем объект книги по первичному ключу
        serializer = BookSerializer(book, data=request.data)  # Передаём объект и новые данные в сериализатор
        if serializer.is_valid():
            serializer.save()  # Обновляем данные в базе
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Пример валидации данных

ModelSerializer автоматически наследует встроенные механизмы валидации Django (например, проверка уникальности), но вы можете добавить собственную валидацию при необходимости. Для этого переопределите метод validate_<field>.

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

    def validate_isbn(self, value):
        if not value.isdigit():
            raise serializers.ValidationError("ISBN должен содержать только цифры.")
        if len(value) != 13:
            raise serializers.ValidationError("ISBN должен быть длиной в 13 символов.")
        return value

Теперь при добавлении или изменении объекта книги сериализатор автоматически проверяет поле isbn перед сохранением данных.

Итоговый пример использования

Давайте соберём всё вместе и создадим полноценный API для работы с книгами.

urls.py:

from django.urls import path
from .views import BookCreateAPIView, BookUpdateAPIView

urlpatterns = [
    path('books/', BookCreateAPIView.as_view(), name='book-create'),
    path('books/<int:pk>/', BookUpdateAPIView.as_view(), name='book-update'),
]

views.py:

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookCreateAPIView(APIView):
    def post(self, request):
        serializer = BookSerializer(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)

class BookUpdateAPIView(APIView):
    def put(self, request, pk):
        book = Book.objects.get(pk=pk)
        serializer = BookSerializer(book, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Теперь у нас есть API для создания и обновления книг, которое использует мощь ModelSerializer для управления данными.

ModelSerializer — это невероятный инструмент, который позволяет сосредоточиться на логике приложения вместо написания рутинного кода. С ним работа с данными становится более удобной, быстрой и безопасной.

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