Django + grapheneでGraphQLサーバを構築してMutationを行う方法について解説します。
DjangoでGraphQLサーバを構築する方法についてはこちら(Dockerを使います)
解説は上記記事で構築した環境をもとに行いますので、プロジェクトやアプリケーションのディレクトリ、docker関連のコマンドなどは適宜読み替えてください。
プロジェクト ... /project
アプリケーション ... /app
モデルとスキーマを定義
プロジェクトとアプリケーションに、モデルとスキーマの情報を記述していきます。
今回は果物を題材にしたモデルを定義し、クエリを実装していきます。
app/models.py
from django.db import models
class Fruit(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=255, blank=True, null=True)
color = models.CharField(max_length=255, blank=True, null=True)
created = models.DateTimeField(blank=True, null=True)
def __str__(self):
return self.name
app/types.py
from graphene_django.types import DjangoObjectType
from app.models import Fruit
class FruitType(DjangoObjectType):
class Meta:
model = Fruit
app/scheme.py
import graphene
from app.models import Fruit
from .types import FruitType
class Query:
fruit= graphene.Field(FruitType, id=graphene.Int())
all_fruits = graphene.List(FruitType)
def resolve_fruit(self, info, **kwargs):
id = kwargs.get('id')
if id is not None:
return Fruit.objects.get(pk=id)
return None
def resolve_all_fruits(self, info, **kwargs):
return Fruit.objects.all()
class CreateFruitMutation(graphene.Mutation):
class Arguments:
name = graphene.String(required=True)
color = graphene.String(required=True)
fruit = graphene.Field(FruitType)
def mutate(self, info, name, color):
fruit = Fruit.objects.create(name=name, color=color)
return CreateFruitMutation(fruit=fruit)
class UpdateFruitMutation(graphene.Mutation):
class Arguments:
name = graphene.String()
color = graphene.String()
id = graphene.ID(required=True)
fruit = graphene.Field(FruitType)
def mutate(self, info, name, color, id):
fruit = Fruit.objects.get(id=id)
fruit.name = name
fruit.color = color
fruit.save()
return UpdateFruitMutation(fruit=fruit)
class DeleteFruitMutation(graphene.Mutation):
class Arguments:
id = graphene.ID(required=True)
fruit = graphene.Field(FruitType)
def mutate(self, info, id):
fruit = Fruit.objects.get(id=id)
fruit.delete()
return DeleteFruitMutation()
class Mutation(graphene.ObjectType):
create_fruit = CreateFruitMutation.Field()
update_fruit = UpdateFruitMutation.Field()
delete_fruit = DeleteFruitMutation.Field()
project/scheme.py
import graphene
from app.scheme import Query, Mutation
class Query(Query, graphene.ObjectType):
pass
class Mutation(Mutation, graphene.ObjectType):
pass
schema = graphene.Schema(
query=Query,
mutation=Mutation
)
サーバを起動し、Mutationを行っていきます。
Mutationを行う
http://localhost:8000/graphql/ にアクセスするとMutationを行うことができます。
作成、更新、削除のMutationのサンプルは下記になります。
作成
mutation {
createFruit (name: "ぶどう", color: "紫") {
fruit {
id
name
color
created
}
}
}