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', 'Тверда обкладинка'), ('SOFT', 'М'яка обкладинка')])
    language = models.CharField(max_length=2, choices=[('EN', 'Англійська'), ('FR', 'Французька'), ('ES', 'Іспанська')])

    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 — це неймовірний інструмент, який дозволяє зосередитися на логіці застосунку замість написання рутинного коду. З ним робота з даними стає більш зручною, швидкою та безпечною.

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