Що ж, настав час об'єднати наші знання в єдине ціле та створити повноцінний API з використанням усіх пройдених концепцій.
Частина 1: постановка задачі
Ми створюємо API для управління бібліотекою книг. Наш API має:
- Дозволяти користувачам:
- Отримувати список усіх книг;
- Шукати книги за автором або назвою;
- Отримувати детальну інформацію про конкретну книгу.
- Надавати адміністраторам можливість:
- Додавати та редагувати книги;
- Видаляти книги.
- Обмежувати дії на основі ролей:
- Тільки адміністратор може змінювати дані.
Частина 2: підготовка моделі та проєкту
- Створення моделі
Припустимо, що в нашому проєкті вже є базова модель для книги. Якщо її немає, додамо її:
# 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
- Налаштування
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")
- Визначення 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: мутації для керування даними
- Створення мутацій
Тепер додамо мутації для створення, оновлення та видалення книг:
# 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)
- Підключення мутацій
Тепер додамо мутації до нашої схеми:
# schema.py
class Mutation(graphene.ObjectType):
create_book = CreateBook.Field()
update_book = UpdateBook.Field()
delete_book = DeleteBook.Field()
Частина 5: налаштування автентифікації та дозволів
- Обмеження мутацій для адміністраторів
Додамо перевірку ролі користувача всередині мутацій. Наприклад:
# schema.py
def mutate(self, info, **kwargs):
user = info.context.user
if not user.is_authenticated or not user.is_staff:
raise Exception("Ви повинні бути адміністратором, щоб виконувати цю дію!")
# Ваш код для зміни даних...
- Налаштування 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
Приклад запитів
- Отримання всіх книг:
query {
allBooks {
id
title
author
}
}
- Додавання книги:
mutation {
createBook(
title: "Війна і мир"
author: "Лев Толстой"
publishedDate: "1869-01-01"
isbn: "978-5-389-07457-6"
summary: "Великий роман про життя і долю людства."
) {
book {
id
title
}
}
}
Тепер ваш GraphQL API готовий! Ви створили повноцінний API, який можна використовувати в реальній розробці. 🌟 Ви молодці!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ