🧑‍🚀

Djangoで触るGraphQL API

2021/08/21に公開

Building GraphQL APIs in Django with Graphene

GraphQLとは?については触れない

できるようになること

  • REST APIのGETメソッドに該当するQueryを実行し、結果(レスポンス)が返ってくること
  • REST APIのPOSTメソッドに該当するMutationを実行し、データを作成できること(更新処理は今回は触れない)

graphene-djangoのインストール

pip install graphene-django

自分の環境だと requirementsを利用しているため、

requirements.txtに記述にしてインストール。(各環境に合わせ実施する)

settings.pyに設定を記述

以降、configプロジェクトおよび appアプリケーションが作成済みであることを前提に話を進める

なぜconfig/appなのかは 「オレオレベストプラクティス in Django dictory structure」を参照

config/settings.yml

INSTALLED_APPS = [
    'xxx',
    'xxx',
    'graphene_django', ← (これを追加する)
]
# 新しく追加する
GRAPHENE = {
    # configの箇所はプロジェクト名が入る
    'SCHEMA': 'config.schema.schema',
}

モデルの定義

app/models/post.py

from django.db import models

class Post(models.Model):
    class Meta
        db_table = 'posts'
        
    title = models.CharField(max_length=128)
    body = models.TextField()

app/models/init.py

from .post import Post 

makemigrationでマイグレーションファイルを作成後

migrateでマイグレーションをしてお(DBへ反映させておく)

Schemaの定義

app/ディレクトリ(アプリケーションディレクトリ)配下にschema.pyを作成する

import graphene
from graphene_django import DjangoObjectType
from .models import *

class PostType(DjangoObjectType):
    class Meta:
        model = Post

class Query(graphene.ObjectType):
    posts = graphene.List(PostType)

    def resolve_posts(self, info, **kwargs):
        return Post.objects.all()

class CreatePost(graphene.Mutation):
    id = graphene.String()
    title = graphene.String()
    body = graphene.String()

    class Arguments:
        title = graphene.String()
        body = graphene.String()

    def mutate(self, info, title, body):
        post = Post(title=title, body=body)
        post.save()

        return post

class Mutation(graphene.ObjectType):
    create_post = CreatePost.Field()

config/ディレクトリ配下にもschema.pyを作成する

import graphene
import app.schema

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

class Mutation(app.schema.Mutation, graphene.ObjectType):
    pass

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

urlsの設定

GraphQL APIは単一のエンドポイント

config/urls.py

from django.contrib import admin
from django.urls import path
from django.views.decorators.csrf import csrf_exempt # ← (これを追加)
from graphene_django.views import GraphQLView # ← (これを追加)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True))), # ← (これを追加)
]

実行

PostmanやGraphiQL、CURLから実際にリクエストしてみる

POST - http://localhost/graphql/

bodyにquery追加(以下参考)

値の取得(Queryを実行し、結果(レスポンス)が返ってくること)

query {
    posts {
        id
        title
        body
    }
}

データ作成(Mutationを実行し、データを作成できること)

mutation{
	createPost(
		title: "テスト投稿",
    body: "投稿内容"
	){
        title
        body
    }
}

Discussion