JavaRush /Курсы /Модуль 3: Django /Создание простого GraphQL API

Создание простого GraphQL API

Модуль 3: Django
24 уровень , 2 лекция
Открыта

Давайте создадим простой API для работы с моделью "Книга".
Мы реализуем базовый запрос для получения списка книг, а также добавим возможность добавлять новые записи с помощью мутаций.

Создание схемы (schema) в GraphQL

Схема в GraphQL — это путеводитель, описывающий, какие данные доступны для запроса и какие операции можно выполнять. Она состоит из типов данных, запросов Query и мутаций Mutation. В терминологии Django это можно сравнить с маршрутизацией urls.py, где мы объявляем пути и соответствующие им функции.

Добавление схемы в проект

  1. Создаём модель для книги

Сначала нам нужна базовая модель для нашего 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
  1. Добавляем сериализацию модели через 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__"  # Все поля будут доступны для запросов
  1. Создаём схему 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()
  1. Подключаем схему к проекту

Мы определили схему для книги, но 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.

  1. Запрос списка книг

Открываем http://127.0.0.1:8000/graphql в браузере и вводим следующий запрос:

query {
  allBooks {
    id
    title
    author
    publishedDate
    price
  }
}

Если вы добавите хотя бы одну запись в базу данных, то увидите результат в красивом JSON-формате.

  1. Создание новой книги

Для добавления новой книги используем мутацию:

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, который мы будем развивать в последующих лекциях.

1
Задача
Модуль 3: Django, 24 уровень, 2 лекция
Недоступна
Добавление мутации для создания объекта
Добавление мутации для создания объекта
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ