С места в карьер! Там где все обычно пишут модели, представления и странички для блога, я же предлагаю окунуться сразу в нечто более полезное, а именно решить поставленную задачу.
Суть задачи в следующем: Необходимо, что бы 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 объект.
Комментарии
Оставить комментарийВойдите, чтобы оставить комментарий.
Комментариев пока нет.