How to Build a GraphQL API in Django
Если вы создаете приложение на Django и подумываете об использовании GraphQL, вы не одиноки.
REST используется уже много лет, но GraphQL быстро становится излюбленным вариантом для разработчиков, которым нужна большая гибкость и меньше переходов между интерфейсом и серверной частью.
Я потратил много времени, работая с Django и пробуя различные способы сделать API более плавными, и я понимаю, почему люди переходят на GraphQL.
Вы запрашиваете именно те данные, которые вам нужны, и получаете именно их. Никаких лишних уточнений, никаких множественных запросов для объединения данных — это все равно, что заказывать что-то из меню и получать именно то, что вы хотели, каждый раз.
Итак, если вам интересно, как создать GraphQL API с помощью Django, я вам все расскажу.
Я расскажу вам о том, что такое GraphQL, почему в некоторых случаях он может подойти лучше, чем REST, и как вы можете начать с нуля, даже если вы не являетесь экспертом в GraphQL (пока).
Вот о чем мы расскажем:
Что такое GraphQL и почему это так важно?
GraphQL — это язык запросов для API-интерфейсов и, что более важно, это среда выполнения для выполнения этих запросов с вашими данными.
Facebook разработал его в 2012 году, а в 2015 году он стал общедоступным. С тех пор его используют такие компании, как GitHub, Shopify, Twitter и Pinterest.
В отличие от REST, где вам часто приходится выполнять несколько запросов, чтобы получить все необходимые данные, GraphQL позволяет вам получить все ваши данные в одном запросе.
Это очень важно, особенно для мобильных приложений или медленных сетей, где меньшее количество запросов означает более высокую производительность.
Допустим, вам нужны имя пользователя, фотография профиля и 3 его последние записи в блоге. В REST вам, возможно, потребуется использовать 2-3 разные конечные точки. В GraphQL? Один запрос выполнен.
Это также удобно для разработчиков интерфейсов, потому что они могут формировать данные, которые они получают обратно, не дожидаясь, пока разработчики серверной части создадут новые конечные точки.
Что Вам понадобится перед началом работы
Прежде чем приступить к работе, вот что у вас уже должно быть:
-
Базовые знания Django (модели, представления и т.д.)
-
Установлен Python (лучше всего версия 3.8+)
-
Создан проект на Django
-
pip или pipenv для управления пакетами
Если вы начинаете с нуля, вы можете запустить новый проект на Django с помощью:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
Как создать GraphQL API в Django
Давайте перейдем к делу.
1. Установить Graphene-Django
Graphene - самая популярная библиотека для использования GraphQL с Python. Специально для Django существует пакет под названием graphene-django.
Вы можете установить его следующим образом:
pip install graphene-django
Затем добавьте его в свой INSTALLED_APPS:
INSTALLED_APPS = [
...
'graphene_django',
]
2. Добавьте простую модель
Вот простая модель для работы. В myapp/models.py:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
published = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Затем запустите свои миграции:
python manage.py makemigrations
python manage.py migrate
3. Создайте схему
В myapp/schema.py начните с:
import graphene
from graphene_django.types import DjangoObjectType
from .models import Post
class PostType(DjangoObjectType):
class Meta:
model = Post
class Query(graphene.ObjectType):
all_posts = graphene.List(PostType)
def resolve_all_posts(root, info):
return Post.objects.all()
schema = graphene.Schema(query=Query)
Затем в настройках вашего проекта Django добавьте:
GRAPHENE = {
"SCHEMA": "myapp.schema.schema"
}
И, наконец, в вашем urls.py:
from django.urls import path
from graphene_django.views import GraphQLView
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),
]
Теперь перейдите на страницу http://localhost:8000/graphql и попробуйте выполнить этот запрос:
{
allPosts {
title
content
published
}
}
Бум. Вы только что запросили свою базу данных с помощью GraphQL.
Вот как должна выглядеть ваша игровая площадка GraphQL.

Как добавлять мутации (также известные как Запись Данных)
GraphQL предназначен не только для чтения данных. Вы также можете создавать, обновлять и удалять данные. Вот как добавить мутацию для создания записи:
В myapp/schema.py:
class CreatePost(graphene.Mutation):
class Arguments:
title = graphene.String(required=True)
content = graphene.String(required=True)
post = graphene.Field(PostType)
def mutate(self, info, title, content):
post = Post(title=title, content=content)
post.save()
return CreatePost(post=post)
class Mutation(graphene.ObjectType):
create_post = CreatePost.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)
Теперь в GraphiQL playground вы можете запустить:
mutation {
createPost(title: "My First Post", content: "Hello GraphQL!") {
post {
id
title
}
}
}
Довольно чисто, не так ли?
Пошаговое руководство по коду: Создание записи с помощью мутации в GraphQL
Позвольте мне познакомить вас с кодом, объяснить, что он делает и как GraphQL позволяет ему работать.
Шаг 1: Класс мутаций CreatePost
class CreatePost(graphene.Mutation):
class Arguments:
title = graphene.String(required=True)
content = graphene.String(required=True)
post = graphene.Field(PostType)
def mutate(self, info, title, content):
post = Post(title=title, content=content)
post.save()
return CreatePost(post=post)
Вот что происходит в этой части:
-
graphene.Mutation: Это определяет пользовательскую мутацию, которая в GraphQL используется для изменения данных на стороне сервера (аналогично POST, PUT и DELETE в REST). -
class Arguments: Думайте об этом как о "входной" части мутации. Нам требуютсяtitleиcontent, оба в виде строк. Это то, что клиент должен предоставить при вызове мутации. -
post = graphene.Field(PostType): Это определяет возвращаемый тип мутации. В этом случае, как только запись создана, мы возвращаем ее, используя пользовательский тип GraphQL с именемPostType. -
mutate(self, info, title, content): Этот метод вызывается при выполнении мутации. Внутри него:-
Мы создаем новый
Postэкземпляр модели. -
Мы сохраняем его в базе данных.
-
Мы возвращаем результат мутации в виде
CreatePostобъекта с прикрепленным новым сообщением.
-
-
Это позволяет сохранить логику простой, читабельной и тестируемой – отличный пример чистого дизайна API.
Шаг 2: Включение мутации в схему
class Mutation(graphene.ObjectType):
create_post = CreatePost.Field()
Здесь мы регистрируем нашу мутацию. В GraphQL все операции (запросы и мутации) должны быть частью схемы. Добавляя create_post к классу Mutation, мы предоставляем его конечной точке GraphQL.
Шаг 3: Окончательная схема
schema = graphene.Schema(query=Query, mutation=Mutation)
В этом коде
-
Мы создаем новый
graphene.Schema. -
Мы передаем класс
Query(предполагается, что он определен в другом месте для операций чтения) и наш классMutationдля операций записи.
Это GraphQL-эквивалент подключения к Django urls.py – это то, что становится доступным клиентам, когда они попадают в вашу конечную точку /graphql/.
Как Клиент будет использовать это
Клиент (интерфейс или инструмент тестирования API, такой как Insomnia/Postman) отправил бы мутацию следующим образом:
mutation {
createPost(title: "GraphQL is Awesome", content: "Let's build APIs with it!") {
post {
id
title
content
}
}
}
И получите ответ типа:
{
"data": {
"createPost": {
"post": {
"id": "1",
"title": "GraphQL is Awesome",
"content": "Let's build APIs with it!"
}
}
}
}
Бонус: Почему это так важно для разработчиков
-
Разработчики интерфейсов теперь могут создавать формы и мгновенно видеть структуру ответа.
-
Серверные разработчики определяют, что разрешено, и обрабатывают только необходимую логику.
-
Больше никаких избыточных или неполных данных - GraphQL предоставляет вам именно то, что вы просите.
-
Легко тестируется, отлаживается и масштабируется.
Убедитесь, что у Вас установлено следующее
-
Убедитесь, что у вас установлен
graphene-django. -
Добавьте
'graphene_django'в свойINSTALLED_APPS. -
Подключите схему в вашем проекте Django.
urls.py.
from django.urls import path
from graphene_django.views import GraphQLView
from myapp.schema import schema
urlpatterns = [
path("graphql/", GraphQLView.as_view(graphiql=True, schema=schema)),
]
Плюсы и минусы использования GraphQL в Django
Плюсы:
-
Гибкие запросы
-
Отлично подходит для разработчиков интерфейсов
-
Меньше вызовов API
-
Строго типизированная схема
-
Повышение производительности в более медленных сетях
Минусы:
-
Немного более крутая кривая обучения
-
Больше возможностей для настройки, чем для ОТДЫХА
-
Может быть излишним для простых API-интерфейсов
Часто задаваемые вопросы
Является ли GraphQL лучше, чем REST?
Это зависит от обстоятельств. GraphQL предоставляет вам больше контроля и гибкости, но REST легче кэшировать и проще настраивать для небольших проектов.
Является ли Graphene единственным способом использования GraphQL с Django?
Нет. Вы также можете использовать Ariadne или Strawberry. Но графен является наиболее зрелым и широко используемым на данный момент.
Хорошо ли GraphQL работает с фреймворком Django REST?
Они могут работать бок о бок. Если у вас уже есть REST API и вы хотите добавить GraphQL, вам не нужно ничего выбрасывать.
Что дальше?
Как только вы освоитесь с основами, вы сможете:
-
Добавить аутентификацию с помощью JWT или сеансов
-
Используйте Relay, если вам нужна разбивка на страницы и фильтрация
-
Подключите свой GraphQL API к React, Vue или любому другому интерфейсу
Заключительные мысли
Если вы уже давно используете Django и хотите сделать свой API немного более мощным и гибким, GraphQL на 100% стоит того, чтобы его использовать.