はじめに
前回の調査記事
- 下記の記事をみることで環境構築とデータを取得する箇所までは実装できている 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 } } }