プログラミング

【Python】Django + grapheneでMutationを行う

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
    }
  }
}

更新

  • この記事を書いた人
  • 最新記事

おみ

プログラミング学習やキャリアのことを発信していきます。【経歴】1999年生まれ。専門学校卒業後、大手企業やベンチャー企業でSEとして勤務。現在は某メガベンチャーでFlutterエンジニアとして働いています。

-プログラミング
-, , ,