У цій лекції ми розберемося з 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 — це неймовірний інструмент, який дозволяє зосередитися на логіці застосунку замість написання рутинного коду. З ним робота з даними стає більш зручною, швидкою та безпечною.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ