🧑🚀
Djangoで触るGraphQL API
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