Steps for Django GraphQL -- Mutation api

api 除了查询功能外还需要写入,在 graphql 里面,写入要用 Mutation。

回到我们的 schema 本体,把它改成:
schema = graphene.Schema(query=Query, mutation=Mutation)

新增一个 Mutation class,整份 schema.py 现在长这样:

import graphenefrom collections import namedtuple from .schemaClass.playDataSchema import playDataSchema #---- 新增以下 ----------------------from .mutations.writePlayData import writePlayData as writePlayDataMutation#-----------------------------------from api.api.playData import playDatafrom api.api.writePlayData import writePlayDataclass Query(graphene.ObjectType):    reverse = graphene.String(word=graphene.String(default_value='t'))    def resolve_reverse(self, info, word):        print(self)        return 'hello'    playData = graphene.List(playDataSchema, name = graphene.String())    # playData = graphene.NonNull(playDataSchema, name = graphene.String())    def resolve_playData(self, info, name):        data = playData( {'name': name} )['data']        if len(data) > 0:            # --- 转成 namedtuple ---            outDataNT = namedtuple('myData', [ key for key in data[0] ])            outData = [ outDataNT(**eachData) for eachData in data ]            # ----------------------            return outData        else:             return []#---- 新增以下 ----------------------class Mutation(graphene.ObjectType):    writePlayData = writePlayDataMutation.Field()    def resolve_writePlayData(self, info):        return writePlayDataMutation        #------------------------------------schema = graphene.Schema(query=Query, mutation=Mutation)

在这次变动中,我们从 mutation 资料夹里的 writePlayData 档案中 import 了一个 Mutation 的 class,并把它命名为 writePlayDataMutation (现在还没有这个档案,我们等下再来创建它)。

然后新增了 Mutation 类别作为 mutation 的中枢,当使用者想要 writePlayData 时我们返回给它刚刚 import 的 mutation 类别, writePlayDataMutation.Field() 可以把它当成是将 mutation 类别降级成跟 string 类别一样,才能放进 graphene.ObjectType 类别里面。


创建一个资料夹 mutations 来放置所有的 mutation 文件,并创立 __init.pywritePlayData.py

writePlayData.py 的内容如下:

import graphenefrom api.api.writePlayData import writePlayData as writePlayDataFuncclass writePlayData(graphene.Mutation):    class Arguments:        name = graphene.String()        lv = graphene.Int()        skill = graphene.String()        status = graphene.Boolean()    err = graphene.String()    def mutate(self, info, name, lv, skill):        data = writePlayDataFunc( {             'name': name,            'lv': lv,             'skill': skill        } )        status = data['status']        err = data['err']        return writePlayData(status=status, err=err)

writePlayDataFunc 是一只可以写入资料库的 api 并且会返回 { status, err }, status 代表有没有写入成功。

接下来讲解 graphene.Mutation 的架构:
在 mutation 这个类别里,有三个元素

class writePlayData(graphene.Mutation):# 第一个元素: 写入所需要的参数-----------------    class Arguments:        name = graphene.String()        lv = graphene.Int()        skill = graphene.String()#-------------------------------------------# 第二个元素: 可以返回给使用者的资料 ----------    status = graphene.Boolean()    err = graphene.String()#-------------------------------------------# 第三个元素: 实际执行写入,并回传值 ----------    def mutate(self, info, name, lv, skill):        data = writePlayDataFunc( {             'name': name,            'lv': lv,             'skill': skill        } )        status = data['status']        err = data['err']        return writePlayData(status=status, err=err)              #注意这边是 call 自己#-------------------------------------------

在 mutation 里面,class Arguments:def mutate(): 是必要的,没有的话会报错。

接下来 run 伺服器后就可以看到成果啰
http://img2.58codes.com/2024/20107235iOryihBHWd.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章