Loading

Geomer@Blog:~$ _

Блог ленивого программиста


Django Rest Framework вложенный Serializer
2020-06-19T17:13:47Z

Доброго времени суток. В этой статье я расскажу, как сделать сложенные структуры в django rest framework.

На начальный этапах работы с у меня возникла проблема. В связи с тем, что я не умел работать с вложенностью мне приходилось плодить очень много url путей, для достижения заданной цели. Но решение оказалось достаточно банальным.

Рассказ о вложенности я начну с настройки окружения и формирования стандартного примера приложения django.

Для начала создадим проект django. Это можно сделать после установки django на ваш компьютер. Полная иструкция приведена на официальном сайте Django.

Выполните следующие команды в терминале:

pip install django
pip install djangorestframework
django-admin startproject <name_your_projects>
cd <name_your_project>/
python manage.py migrate
python manage.py createsuperuser
python manage.py startapp book

Итак, на этом этапе мы создали проект Django. Теперь нам нужно подключить библиотеку.

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #тут мы подключаем библиотеку
    'rest_framework'
    
    # и наш application book
    'book',
]

И так, давайте создадим 2 связанные таблицы, для демонстрации примера:

models.py
from django.db import models


class Author(models.Model):
    name = models.CharField(max_length=255)


class Book(models.Model):
    name = models.CharField(max_length=255)
    authors = models.ForeignKey(Author, on_delete=models.CASCADE)
    number_of_pages = models.IntegerField()

Создадим миграции для данных моделей:

python manage.py makemigrations
python manage.py migrate

Следующим этапом мы создадим serializer для наших моделей. Создавать serializer будем связанные с моделями, используя класс ModelSerializer.

Создадим в папке приложения book файл serizlisers. Он будет выглядеть следующим образом:

serializers.py
from rest_framework import serializers
from .models import *


class AuthorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Author
        fields = "__all__"


class BookSerializer(serializers.ModelSerializer):
    authors = AuthorSerializer(read_only=True)

    class Meta:
        model = Book
        fields = '__all__'

В классе BookSerializer мы делаем вложенность,т.е. изменяем id автора на структуру состоящую из данных самой записи.

Ну и завершающим этапом работы является создание модели представления и маршрутизации.

view.py

from rest_framework.viewsets import ReadOnlyModelViewSet
from .serializers import *


class BooksViewSet(ReadOnlyModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()

<name_your_projects>/urls.py

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('book.urls'))
]

<name_your_projects>/book/urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BooksViewSet

router = DefaultRouter()
router.register('books', BooksViewSet)

urlpatterns = [
    path('', include(router.urls))
]

Результат нашего текстового проекта будет следующим:

Оставить комментрий

Введите Email адрес, для публикации комантация
Ваш Коментрий