JavaRush /Курси /Модуль 3: Django /Практичне заняття зі створення та використання серіалізат...

Практичне заняття зі створення та використання серіалізаторів

Модуль 3: Django
Рівень 17 , Лекція 9
Відкрита

Давай створимо невелике API для управління бібліотекою книг. У нашому API буде реалізована робота з книгами та авторами, включаючи CRUD-операції, а також будемо працювати з вкладеними серіалізаторами, валідацією та кастомізацією.

Основні моменти, які будуть розглянуті:

  1. Робота з ModelSerializer для спрощення серіалізації.
  2. Використання вкладених серіалізаторів.
  3. Валідація даних.
  4. Кастомізація методів серіалізаторів: create(), update().
  5. Використання методу to_representation() для зміни вихідного формату.

Піднімемо свої навички серіалізації на новий рівень, щоб ви стали майстром цього мистецтва!

Підготовка проєкту

Перед початком роботи переконаємося, що у нас є базовий Django-додаток з установленим Django REST Framework. Якщо ви тільки приєдналися, нижче вказані кроки для створення оточення:

  1. Установіть Django та DRF:
    pip install django djangorestframework
    
  2. Створіть Django-проєкт і додаток:
    django-admin startproject library
    cd library
    python manage.py startapp books
    
  3. Зареєструйте додаток books у налаштуваннях INSTALLED_APPS вашого settings.py:
    INSTALLED_APPS = [
        ...
        'rest_framework',
        'books',
    ]
    

Тепер переходимо до створення моделей та API!

Крок 1. Моделі для додатку "Бібліотека"

Ми почнемо зі створення двох моделей: Author і Book. Модель Author буде описувати авторів книг, а модель Book — самі книги. Книга буде пов’язана з автором через поле ForeignKey.

# books/models.py

from django.db import models

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

class Book(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

Запустіть міграції:

python manage.py makemigrations
python manage.py migrate

Крок 2. Створення серіалізатора для моделі Author

Створимо серіалізатор для моделі Author. Почнемо з базового ModelSerializer і налаштуємо поля.

# books/serializers.py

from rest_framework import serializers
from .models import Author

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ['id', 'first_name', 'last_name', 'birth_date']

Цей серіалізатор дозволить нам перетворювати дані авторів у JSON і назад.

Крок 3. Серіалізатор для моделі Book із вкладеним автором

Тепер створимо серіалізатор для моделі Book. Ми додамо вкладений серіалізатор для представлення інформації про автора.

# books/serializers.py

from .models import Book

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()  # Вкладений серіалізатор

    class Meta:
        model = Book
        fields = ['id', 'title', 'description', 'author']

Цей серіалізатор дозволить нам відображати дані про книгу, включаючи інформацію про автора, в одному запиті.

Крок 4. Перевизначення методу create()

Зараз наш серіалізатор BookSerializer "не вміє" автоматично створювати автора при додаванні книги. Виправимо це, перевизначивши метод create().

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()  # Вкладений серіалізатор

    class Meta:
        model = Book
        fields = ['id', 'title', 'description', 'author']

    def create(self, validated_data):
        author_data = validated_data.pop('author')  # Витягуємо дані автора
        author = Author.objects.create(**author_data)  # Створюємо автора
        book = Book.objects.create(author=author, **validated_data)  # Створюємо книгу
        return book

Тепер наш серіалізатор може не тільки обробляти книги, але й "розмножувати" авторів під час роботи.

Крок 5. Валідація даних

Додамо користувацьку валідацію для моделі Author. Наприклад, перевіримо, щоб поле first_name не було порожнім і не містило лише пробілів.

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ['id', 'first_name', 'last_name', 'birth_date']

    def validate_first_name(self, value):
        if not value.strip():  # Перевіряємо, чи не складається значення з пробілів
            raise serializers.ValidationError("Ім'я автора не може бути порожнім!")
        return value

Крок 6. Метод to_representation() для кастомізації виводу

Іноді нам потрібно перетворити дані перед їх відправкою клієнту. Наприклад, додамо повне ім'я автора у вивід.

class AuthorSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Author
        fields = ['id', 'first_name', 'last_name', 'birth_date', 'full_name']

    def get_full_name(self, obj):
        return f"{obj.first_name} {obj.last_name}"

Тепер поле full_name автоматично додається при виведенні даних про автора.

Крок 7. APIView для роботи з книгами

Ми використовуємо DRF представлення для обробки запитів. Створимо просте API для роботи з книгами.

# books/views.py

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

class BookListCreateAPIView(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    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)

Крок 8. Маршрути

Налаштуємо маршрути для нашого API.

# books/urls.py

from django.urls import path
from .views import BookListCreateAPIView

urlpatterns = [
    path('books/', BookListCreateAPIView.as_view(), name='book-list-create'),
]

Не забудьте підключити їх у основному urls.py проєкту.

Крок 9. Тестування API

Запустіть локальний сервер:

python manage.py runserver

Тепер ви можете:

  1. Надіслати GET-запит на /books/ і отримати список книг.
  2. Надіслати POST-запит на /books/ з даними книги та автора, щоб створити їх.

Приклад тіла POST-запиту:

{
    "title": "1984",
    "description": "Дистопічний роман",
    "author": {
        "first_name": "Джордж",
        "last_name": "Оруелл",
        "birth_date": "1903-06-25"
    }
}

Тепер у вас є потужний інструмент для роботи з даними через Django REST Framework! Розвивайте свій API і не забувайте експериментувати!

3
Опитування
Серіалізація пов'язаних об'єктів, рівень 17, лекція 9
Недоступний
Серіалізація пов'язаних об'єктів
Серіалізація пов'язаних об'єктів
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ