Давайте создадим простой API для работы с моделью "Книга".
Мы реализуем базовый запрос для получения списка книг, а также добавим возможность добавлять новые записи с помощью мутаций.
Создание схемы (schema) в GraphQL
Схема в GraphQL — это путеводитель, описывающий, какие данные доступны для запроса и какие операции можно выполнять. Она состоит из типов данных, запросов Query и мутаций Mutation. В терминологии Django это можно сравнить с маршрутизацией urls.py, где мы объявляем пути и соответствующие им функции.
Добавление схемы в проект
- Создаём модель для книги
Сначала нам нужна базовая модель для нашего API. Добавим её в наше приложение books.
# books/models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200) # Название книги
author = models.CharField(max_length=100) # Автор книги
published_date = models.DateField() # Дата публикации
price = models.DecimalField(max_digits=6, decimal_places=2) # Цена
def __str__(self):
return self.title
И не забываем применить миграции:
python manage.py makemigrations
python manage.py migrate
- Добавляем сериализацию модели через
DjangoObjectType
Теперь мы свяжем нашу модель с GraphQL, чтобы данные можно было предоставлять через API.
# books/schema.py
import graphene
from graphene_django.types import DjangoObjectType
from .models import Book
class BookType(DjangoObjectType):
class Meta:
model = Book # Присваиваем модель, которую нужно сериализовать
fields = "__all__" # Все поля будут доступны для запросов
- Создаём схему Query
Как базовая точка входа для всех запросов, Query позволяет определять, какие данные мы можем получить из API. Добавим запрос, который возвращает список всех книг.
# books/schema.py (добавляем к ранее написанному)
class Query(graphene.ObjectType):
all_books = graphene.List(BookType) # Определяем тип результата: список объектов BookType
def resolve_all_books(root, info):
# Запрос данных из базы
return Book.objects.all()
- Подключаем схему к проекту
Мы определили схему для книги, но Django пока не знает, как её использовать. Подключим нашу схему через корневую интеграцию.
# books/schema.py (добавляем окончательно)
schema = graphene.Schema(query=Query)
И теперь зарегистрируем этот файл в urls.py проекта.
# myproject/urls.py
from django.urls import path
from graphene_django.views import GraphQLView
urlpatterns = [
path('graphql', GraphQLView.as_view(graphiql=True)), # Включаем GraphQL и GraphiQL
]
2. Определение точек входа в API
Давацте создадим мутацию для добавления книги.
Запросы (Query) отлично подходят для чтения данных, но как насчёт их изменения? Здесь на помощь приходят мутации (Mutation). Сейчас мы добавим возможность создавать новую книгу через GraphQL.
# books/schema.py
class CreateBook(graphene.Mutation):
class Arguments:
# Аргументы, которые принимает мутация
title = graphene.String(required=True)
author = graphene.String(required=True)
published_date = graphene.Date(required=True)
price = graphene.Float(required=True)
# Определяем, что возвращает мутация
book = graphene.Field(BookType)
def mutate(self, info, title, author, published_date, price):
# Создаём объект книги
book = Book.objects.create(
title=title,
author=author,
published_date=published_date,
price=price
)
return CreateBook(book=book)
Добавляем эту мутацию в корневую схему:
# books/schema.py
class Mutation(graphene.ObjectType):
create_book = CreateBook.Field() # Добавляем нашу мутацию
schema = graphene.Schema(query=Query, mutation=Mutation) # Указываем обе операции
Тестирование GraphQL API
Всё готово! Теперь давайте протестируем наш GraphQL API через GraphiQL.
- Запрос списка книг
Открываем http://127.0.0.1:8000/graphql в браузере и вводим следующий запрос:
query {
allBooks {
id
title
author
publishedDate
price
}
}
Если вы добавите хотя бы одну запись в базу данных, то увидите результат в красивом JSON-формате.
- Создание новой книги
Для добавления новой книги используем мутацию:
mutation {
createBook(
title: "1984"
author: "George Orwell"
publishedDate: "1949-06-08"
price: 19.99
) {
book {
id
title
author
}
}
}
Результат подтвердит успешное создание объекта книги:
{
"data": {
"createBook": {
"book": {
"id": "1",
"title": "1984",
"author": "George Orwell"
}
}
}
}
Заключение
В этой лекции мы научились создавать простую схему GraphQL, определять запросы и мутации, а также тестировать API через GraphiQL. Это первый шаг к построению более сложного и функционального API, который мы будем развивать в последующих лекциях.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ