Django 10. Пишем API - Сериализатор
В этом посте, мы создадим сериализатор данных из объекта модели. Для этого будем использовать классы в Django REST Framework.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 462013
Реклама
С места в карьер! Там где все обычно пишут модели, представления и странички для блога, я же предлагаю окунуться сразу в нечто более полезное, а именно решить поставленную задачу.
Суть задачи в следующем: Необходимо, что бы 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 объект.
Все статьи