Давай створимо невелике API для управління бібліотекою книг. У нашому API буде реалізована робота з книгами та авторами, включаючи CRUD-операції, а також будемо працювати з вкладеними серіалізаторами, валідацією та кастомізацією.
Основні моменти, які будуть розглянуті:
- Робота з
ModelSerializerдля спрощення серіалізації. - Використання вкладених серіалізаторів.
- Валідація даних.
- Кастомізація методів серіалізаторів:
create(),update(). - Використання методу
to_representation()для зміни вихідного формату.
Піднімемо свої навички серіалізації на новий рівень, щоб ви стали майстром цього мистецтва!
Підготовка проєкту
Перед початком роботи переконаємося, що у нас є базовий Django-додаток з установленим Django REST Framework. Якщо ви тільки приєдналися, нижче вказані кроки для створення оточення:
- Установіть Django та DRF:
pip install django djangorestframework - Створіть Django-проєкт і додаток:
django-admin startproject library cd library python manage.py startapp books - Зареєструйте додаток
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
Тепер ви можете:
- Надіслати GET-запит на
/books/і отримати список книг. - Надіслати POST-запит на
/books/з даними книги та автора, щоб створити їх.
Приклад тіла POST-запиту:
{
"title": "1984",
"description": "Дистопічний роман",
"author": {
"first_name": "Джордж",
"last_name": "Оруелл",
"birth_date": "1903-06-25"
}
}
Тепер у вас є потужний інструмент для роботи з даними через Django REST Framework! Розвивайте свій API і не забувайте експериментувати!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ