Mộc Viên's Blog Mộc Viên's Blog
Hướng dẫn tích hợp GraphQL vào dự án Django, và cách truy vấn cơ bản

Hướng dẫn tích hợp GraphQL vào dự án Django, và cách truy vấn cơ bản

Ngày đăng:

Hướng dẫn tích hợp GraphQL vào dự án Django, và cách truy vấn cơ bản

Để tích hợp GraphQL vào dự án Django, bạn cần thực hiện các bước sau:

1. Cài đặt các thư viện cần thiết

pip install graphene-django

2. Cập nhật cấu hình Django (settings.py)

INSTALLED_APPS = [
    # ...
    'graphene_django',
    # ...
]

GRAPHENE = {
    'SCHEMA': 'project.schema.schema'  # Đường dẫn đến schema chính
}

3. Tạo schema cho model

Giả sử bạn có một model Book trong ứng dụng books:

# books/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    published_date = models.DateField()
    
    def __str__(self):
        return self.title

Tạo file schema cho ứng dụng:

# books/schema.py
import graphene
from graphene_django import DjangoObjectType
from .models import Book

class BookType(DjangoObjectType):
    class Meta:
        model = Book
        fields = ("id", "title", "author", "published_date")

class Query(graphene.ObjectType):
    all_books = graphene.List(BookType)
    book = graphene.Field(BookType, id=graphene.Int())
    
    def resolve_all_books(self, info):
        return Book.objects.all()
    
    def resolve_book(self, info, id):
        return Book.objects.get(pk=id)

4. Tạo schema chính cho dự án

# project/schema.py
import graphene
import books.schema

class Query(books.schema.Query, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query)

5. Cấu hình URL

# 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))),
]

Các truy vấn cơ bản

Sau khi cài đặt, bạn có thể truy cập GraphiQL interface tại http://localhost:8000/graphql/ và thực hiện các truy vấn:

Lấy tất cả sách

query {
  allBooks {
    id
    title
    author
    publishedDate
  }
}

Lấy sách theo ID

query {
  book(id: 1) {
    title
    author
  }
}

Thêm mutation để tạo/cập nhật dữ liệu

# books/schema.py
class CreateBookMutation(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
        author = graphene.String(required=True)
        published_date = graphene.String(required=True)
        
    book = graphene.Field(BookType)
    
    def mutate(self, info, title, author, published_date):
        book = Book(
            title=title,
            author=author,
            published_date=published_date
        )
        book.save()
        return CreateBookMutation(book=book)

class Mutation(graphene.ObjectType):
    create_book = CreateBookMutation.Field()

Cập nhật schema chính:

# project/schema.py
class Mutation(books.schema.Mutation, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query, mutation=Mutation)

Truy vấn mutation:

mutation {
  createBook(
    title: "Django for Beginners"
    author: "William S. Vincent"
    publishedDate: "2020-01-01"
  ) {
    book {
      id
      title
    }
  }
}

Gần đây