JavaRush /Курси /Модуль 3: Django /Практичне заняття зі створення GraphQL API

Практичне заняття зі створення GraphQL API

Модуль 3: Django
Рівень 24 , Лекція 9
Відкрита

Що ж, настав час об'єднати наші знання в єдине ціле та створити повноцінний API з використанням усіх пройдених концепцій.

Частина 1: постановка задачі

Ми створюємо API для управління бібліотекою книг. Наш API має:

  1. Дозволяти користувачам:
    • Отримувати список усіх книг;
    • Шукати книги за автором або назвою;
    • Отримувати детальну інформацію про конкретну книгу.
  2. Надавати адміністраторам можливість:
    • Додавати та редагувати книги;
    • Видаляти книги.
  3. Обмежувати дії на основі ролей:
    • Тільки адміністратор може змінювати дані.

Частина 2: підготовка моделі та проєкту

  1. Створення моделі

Припустимо, що в нашому проєкті вже є базова модель для книги. Якщо її немає, додамо її:

# 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()
    isbn = models.CharField(max_length=13, unique=True)
    summary = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.title

Після додавання моделі не забудьте виконати міграції:

python manage.py makemigrations
python manage.py migrate

Частина 3: створення схеми для GraphQL

  1. Налаштування DjangoObjectType

Для роботи з GraphQL ми використовуємо бібліотеку graphene-django. Переконайтеся, що вона встановлена:

pip install graphene-django

Тепер створимо тип об'єкта для нашої моделі Book:

# schema.py (у додатку, наприклад, "library")
import graphene
from graphene_django.types import DjangoObjectType
from .models import Book

class BookType(DjangoObjectType):
    class Meta:
        model = Book
        fields = ("id", "title", "author", "published_date", "isbn", "summary")
  1. Визначення Query для читання даних

Додамо можливість отримувати список книг та деталі про конкретну книгу:

# schema.py
class Query(graphene.ObjectType):
    all_books = graphene.List(BookType)
    book_by_id = graphene.Field(BookType, id=graphene.Int(required=True))

    def resolve_all_books(self, info):
        return Book.objects.all()

    def resolve_book_by_id(self, info, id):
        try:
            return Book.objects.get(pk=id)
        except Book.DoesNotExist:
            return None

Частина 4: мутації для керування даними

  1. Створення мутацій

Тепер додамо мутації для створення, оновлення та видалення книг:

# schema.py
class CreateBook(graphene.Mutation):
    book = graphene.Field(BookType)

    class Arguments:
        title = graphene.String(required=True)
        author = graphene.String(required=True)
        published_date = graphene.Date(required=True)
        isbn = graphene.String(required=True)
        summary = graphene.String()

    def mutate(self, info, title, author, published_date, isbn, summary=None):
        book = Book(
            title=title,
            author=author,
            published_date=published_date,
            isbn=isbn,
            summary=summary
        )
        book.save()
        return CreateBook(book=book)


class UpdateBook(graphene.Mutation):
    book = graphene.Field(BookType)

    class Arguments:
        id = graphene.Int(required=True)
        title = graphene.String()
        author = graphene.String()
        published_date = graphene.Date()
        isbn = graphene.String()
        summary = graphene.String()

    def mutate(self, info, id, title=None, author=None, published_date=None, isbn=None, summary=None):
        try:
            book = Book.objects.get(pk=id)
            if title:
                book.title = title
            if author:
                book.author = author
            if published_date:
                book.published_date = published_date
            if isbn:
                book.isbn = isbn
            if summary:
                book.summary = summary
            book.save()
            return UpdateBook(book=book)
        except Book.DoesNotExist:
            return None


class DeleteBook(graphene.Mutation):
    success = graphene.Boolean()

    class Arguments:
        id = graphene.Int(required=True)

    def mutate(self, info, id):
        try:
            book = Book.objects.get(pk=id)
            book.delete()
            return DeleteBook(success=True)
        except Book.DoesNotExist:
            return DeleteBook(success=False)
  1. Підключення мутацій

Тепер додамо мутації до нашої схеми:

# schema.py
class Mutation(graphene.ObjectType):
    create_book = CreateBook.Field()
    update_book = UpdateBook.Field()
    delete_book = DeleteBook.Field()

Частина 5: налаштування автентифікації та дозволів

  1. Обмеження мутацій для адміністраторів

Додамо перевірку ролі користувача всередині мутацій. Наприклад:

# schema.py
def mutate(self, info, **kwargs):
    user = info.context.user
    if not user.is_authenticated or not user.is_staff:
        raise Exception("Ви повинні бути адміністратором, щоб виконувати цю дію!")
    # Ваш код для зміни даних...
  1. Налаштування GraphiQL

Щоб протестувати наші запити та мутації, переконаємось, що GraphiQL увімкнено. У settings.py додайте:

GRAPHENE = {
    "SCHEMA": "library.schema.schema",  # Вкажіть шлях до вашої схеми
    "MIDDLEWARE": [
        "graphene_django.debug.DjangoDebugMiddleware",
    ],
}

І налаштуйте URL для GraphQL:

# urls.py
from django.urls import path
from graphene_django.views import GraphQLView

urlpatterns = [
    path("graphql/", GraphQLView.as_view(graphiql=True)),
]

Частина 6: тестування API

Приклад запитів

  1. Отримання всіх книг:
query {
  allBooks {
    id
    title
    author
  }
}
  1. Додавання книги:
mutation {
  createBook(
    title: "Війна і мир"
    author: "Лев Толстой"
    publishedDate: "1869-01-01"
    isbn: "978-5-389-07457-6"
    summary: "Великий роман про життя і долю людства."
  ) {
    book {
      id
      title
    }
  }
}

Тепер ваш GraphQL API готовий! Ви створили повноцінний API, який можна використовувати в реальній розробці. 🌟 Ви молодці!

3
Опитування
Робота з Django моделями через GraphQL, рівень 24, лекція 9
Недоступний
Робота з Django моделями через GraphQL
Робота з Django моделями через GraphQL
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ