Отже, серіалізація. Думаємо, ти ще не забув, що так називається процес пакування (і розпакування) даних, щоб їх можна було або передати клієнту (наприклад, у форматі 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:
- Повний контроль над процесом серіалізації.
- Гнучкість у налаштуванні валідації та обробки даних.
- Можна використовувати для даних, які не пов'язані з моделями Django.
Мінуси Serializer:
- Великий обсяг повторюваного коду.
- Менш зручний для роботи з моделями 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:
- Мінімум коду. Все, що вам потрібно — вказати модель і список полів.
- Автоматична інтеграція з моделлю. Методи
createіupdateвже реалізовані. - Простота використання для типових CRUD операцій.
Мінуси ModelSerializer:
- Обмежена гнучкість (за замовчуванням генерується лише мінімально необхідний функціонал).
- Підходить лише для роботи з моделями 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.
Практичне завдання
- Створіть модель для управління коментарями до статей (наприклад, модель
Comment). - Реалізуйте API для цієї моделі двома способами:
- З використанням
Serializer. - З використанням
ModelSerializer.
- З використанням
- Порівняйте обсяг коду та зручність кожного підходу.
На цьому етапі ви маєте розуміти, як використовувати обидва типи серіалізаторів, і усвідомлювати, який інструмент краще підходить для вашого завдання. 🚀
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ