首先我们先在 graphAPI 子专案资料夹下面创建一个资料夹: schemaClass 来放我们所有的 schema python 档
现在资料夹结构长这样:
- api- djangoAPI+ graphAPI migrations - schemaClass admin.py apps.py models.py schema.py tests.py views.py __init__.py- manage.py
视线回到上次我们製作的 playData api
输入值是 name,返回来的格式长这样
[ { ID: 2, NAME: "Charmander", LV: 35, SKILL: "fire" }]
接下来我们进入 schemaClass 创建 __init__.py
跟 playDataSchema.py
开始定义资料的 schema
在 playDataSchema.py 中加入:
import grapheneclass playDataSchema(graphene.ObjectType): ID = graphene.Int() NAME = graphene.String() LV = graphene.Int() SKILL = graphene.String()
然后回到 graphAPI/schema.py 编辑成以下:
import graphene#--------- 新增以下from collections import namedtuple from .schemaClass.playDataSchema import playDataSchema from api.api.playData import playData#---------class 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()) 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 []#-------------------------------------------schema = graphene.Schema(query=Query)
graphene.List( schema 类别, 需要输入的条件 )
代表要返回一个 list (非阵列用 NonNull),其中每格里面的型别都是第一格输入的型别 (这边是 playDataSchema)。
然后因为 graphene 预设是用 getattr() 这个函数抓值,所以我们要把回来的 dict 转换成 namedtuple 型别 (这个型别可以用 getattr() 抓值)
结束后 run server 就有结果噜!