Cat

Django 10. Пишем API - Сериализатор

В этом посте, мы создадим сериализатор данных из объекта модели. Для этого будем использовать классы в Django REST Framework.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 10 Август 2023 Просмотров: 1031

С места в карьер! Там где все обычно пишут модели, представления и странички для блога, я же предлагаю окунуться сразу в нечто более полезное, а именно решить поставленную задачу. 

 

Суть задачи в следующем: Необходимо, что бы Telegram-бот обращался к Django по определённому адресу, передавая цифровой код, а в ответ получал расположение файла на сервере и собственно отправлял этот файл пользователю. Этим и займёмся в ближайшие несколько постов, а потом уже можно будет отдохнуть за созданием сайта.

 

Django REST Framework.

Первым делом необходимо установить библиотеку djangorestframework командой pip install djangorestframework и добавить установленную версию в requirements.txt.

 

После этого, в директории приложения создадим два файла: api.py и serializers.py.


В файле api.py будем писать обработчики запросов, а в файле serializers.py будет происходить сериализация из данных объекта модели в JSON.

Начинать можно как с сериализатора, так и с обработчика. Но я всё-таки рекомендую начинать с сериализатора, так можно сразу определиться с тем, какие данные нам нужно возвращать.

 

Пишем сериализатор данных.

Перейдём в файл serializers.py и создадим класс FileModelSerializer унаследованный от Django REST ModelSerializer.

 

В нашей модели нет поля path, хранящего путь на сервере до файла, но есть метод для получения такого пути. Но так как сериализатор работает именно с полями модели, а не их методами, создадим новое поле для сериализатора file_path и сделаем его экземпляром класса SerializerMethodField.

Затем создадим класс Meta, наподобие того, что мы делали в модели. Определим в нём поле model и fields. В поле model передадим нашу модель файла, а в поле fields, укажем те поля модели, которые хотим получить, присвоив ему список нужных полей. Нам достаточно поля title и ранее созданного поля file_path.

 

Поскольку поле file_path у нас создано только для сериализатора, необходимо его заполнить данными. Создадим статический метод get_file_path передавая в атрибуты obj, то есть наш объект модели. В этом методе сделаем возврат пути к файлу или None, если пути нет.
 

Код:

from rest_framework import serializers

from . import models


class FileModelSerializer(serializers.ModelSerializer):
    file_path = serializers.SerializerMethodField()

    class Meta:
        model = models.PostFilesModel
        fields = ['title', 'file_path']

    @staticmethod
    def get_file_path(obj):
        return obj.file.path if obj.file else None

 

Таким образом, обратившись к сериализатору FileModelSerializer, и передав в него объект модели PostFilesModel, мы получим данные из двух полей "Название" и "Путь к файлу". А если мы применим к классу метод .data, то в ответ нам вернётся JSON объект.

Автор

    Нет комментариев

    Реклама