AndreyMelnikov.MyBlog # мой блог: IT-марафон.

Все мои посты

Django. Быстро прикручиваем REST API к проекту.

Давайте рассмотрим Django REST framework (djangorestframework), применительно к своему Django-проекту. Это библиотека, которая взаимодействует с моделями Django для реализации гибкого API в рамках разрабатываемого проекта.
Итак, Django REST framework использует три слоя: маршрутизатор (urls), представление (ViewSet) и сериализатор (serializer).
Маршрутизатор определяет URL-адреса, которые будут предоставлять доступ к каждому виду.
Представление определяет функции или классы (чтение, создание, обновление, удаление), которые будут доступны через API.
Сериализатор преобразует информацию, хранящуюся в базе данных, и определенную с помощью моделей Django, в формат, который легко и эффективно передается через API.

Собственно, по этим слоям мы и будем двигаться при создании REST API в своем приложении.
Не забываем добавить библиотеку djangorestframework в настройки нашего проекта. В файле settings.py добавим в атрибут установленных приложений INSTALLED_APPS = […] строку rest_framework в кавычках.
Далее, создадим отдельную директорию api/ в корне каталога с приложением на одном уровне с директориями templates и static. Внутри директории api/ будут располагаться наши файлы (слои) serializers.py, views.py и urls.py. Создадим для начала сериализатор (в serializers.py), наследуя его от ModelSerializer:

class ThingSerializer(serializers.ModelSerializer):
  class Meta:
    model = Thing
    fields = ('name', )

model - тут мы указываем какую модель будем использовать (импортируем из models.py)
fields - указываем, какие поля доступны этому сериализатору из выбранной модели. Также, может быть установлен exclude вместо fields, который будет включать все поля модели, кроме тех, которые указаны в exclude.

Сериализатор анализирует информацию в обоих направлениях (чтение и запись), тогда как представление (ViewSet) - это тот код, в котором определены доступные операции. Наиболее распространенным ViewSet является ModelViewSet
Внутри views.py создаем представление (класс) наследуя его от ModelViewSet:

class ThingViewSet(viewsets.ModelViewSet):
    queryset = Thing.objects.all()
    serializer_class = ThingSerializer

queryset – список, срез объектов запрошенных из БД. Thing.objects.all()- в данном случае запрашиваем все доступные. Можем также использовать фильтрацию: Thing.objects.filter(<название поля в models>=<значение>) serializer_class – привязываем наш сериализатор (импортируя его из serializers.py)

Для корректной работы нашего представления, нам осталось пробросить к нему URL, чтобы запросы клиента попадали в наше представление (вьюху) через URL. Для этого, в основном файле проекта urls.py (находится на одном уровне с settings.py), делаем связность urls с urls из каталога api\, добавляя в список urlpatterns[…] :

urlpatterns = [
	path('api/', include('<директория с приложением>.api.urls')),
	
]

Теперь, при обращении к адресу ..api/, запрос пользователя будет перенаправлен в api\urls.py . Ну и наконец, в каталоге api\ в urls.py делаем привязку к нашему представлению, добавляя в список urlpatterns[…]:

urlpatterns = [
	url(r'^thing/$', ThingViewSet.as_view(), name='ThingViewSet'),

В итоге, обратившись по адресу: ../api/thing/, мы получим список полей из нашей модели. Также мы можем получить данный список в JSON формате, сделав запрос вида: ../api/thing/?format=json

В данной статье рассмотрен самый простой способ “поднять” REST API в своем приложении с минимальным функционалом. Для полноценного взаимодействия, чтобы клиент мог делать изменения, обновлять и удалять данные, то есть операции Create, Read, Update, Delete (CRUD), необходимо переопределять родительские методы класса ModelViewSet, и добавлять соответствующий функционал в ThingSerializer. Но об этом в другой раз.

Назад к списку постов