はじめに
前回の調査記事
- 下記の記事をみることで環境構築とデータを取得する箇所までは実装できている px-wing.hatenablog.com px-wing.hatenablog.com
コード
プロジェクトフォルダにあるschema.pyの設定を変更する
- データ更新時はmutationを利用する graphql.org
- mutationsの記述を追加する
import graphene
import boardapp.schema
class Query(boardapp.schema.Query, graphene.ObjectType):
pass
class Mutation(boardapp.schema.Mutation, graphene.ObjectType):
pass
schema = graphene.Schema(
query=Query,
mutation=Mutation
)
アプリケーションフォルダにあるschema.pyの設定を変更する
- 今回は CreateCategoryMutation と UpdateCategoryMutation と DeleteCategoryMutation の3つのClassを追加する。
それぞれにデータベースの登録・更新・削除処理を実装する
import graphene
from graphene_django.types import DjangoObjectType
from .models import Category, Article
class CategoryType(DjangoObjectType):
class Meta:
model = Category
class ArticleType(DjangoObjectType):
class Meta:
model = Article
class CreateCategoryMutation(graphene.Mutation):
class Arguments:
name = graphene.String(required=True)
category = graphene.Field(CategoryType)
def mutate(self, info, name):
category = Category.objects.create(name=name)
return CreateCategoryMutation(category=category)
class UpdateCategoryMutation(graphene.Mutation):
class Arguments:
name = graphene.String(required=True)
id = graphene.ID()
category = graphene.Field(CategoryType)
def mutate(self, info, name, id):
category = Category.objects.get(pk=id)
category.name = name
category.save()
return UpdateCategoryMutation(category=category)
class DeleteCategoryMutation(graphene.Mutation):
class Arguments:
id = graphene.ID()
category = graphene.Field(CategoryType)
def mutate(self, info, id):
category = Category.objects.get(pk=id)
category.delete()
return DeleteCategoryMutation()
class Mutation(graphene.ObjectType):
create_category = CreateCategoryMutation.Field()
update_category = UpdateCategoryMutation.Field()
delete_category = DeleteCategoryMutation.Field()
class Query(object):
all_categories = graphene.List(CategoryType)
all_articles = graphene.List(ArticleType)
all_users = graphene.List(UserType)
def resolve_all_users(self, info, **kwargs):
return User.objects.all()
def resolve_all_categories(self, info, **kwargs):
return Category.objects.all()
def resolve_all_articles(self, info, **kwargs):
# We can easily optimize query count in the resolve method
return Article.objects.select_related('category').all()
GraphQLで登録・更新・削除
- 登録処理は登録したいデータのIDの指定と変更したいパラメータを指定する
mutation {
createCategory(name: "PHP"){
category{
name
}
}
}
- 更新処理は更新したいデータのIDの指定と変更したいパラメータを指定する
mutation{
updateCategory(id: 1 name: "test"){
category {
name
}
}
}
- 削除処理は削除したデータのIDを指定して削除する
mutation {
deleteCategory(id: 4){
category{
name
}
}
}