フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Django/GrapheneのGraphQLでデータの登録・更新・削除する

はじめに

  • 前回、DjangoでGraphQLでDBに登録された情報にリクエストする処理を実装しましたが、今回はDBのデータを更新する処理を実装する

前回の調査記事

コード

プロジェクトフォルダにある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の設定を変更する

- 今回は CreateCategoryMutationUpdateCategoryMutationDeleteCategoryMutation の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
    }
  }
}