graphene-python学习笔记(9)mutations
1、Mutations
Mutation是一个特殊的类需要定义Input
示例:
import graphene
class CreatePerson(graphene.Mutation):
class Arguments:
name = graphene.String()
ok = graphene.Boolean()
person = graphene.Field(lambda: Person)
def mutate(self, info, name):
person = Person(name=name)
ok = True
return CreatePerson(person=person, ok=ok)
ok和person是createPerson解析完成后的输出(output)参数。
name是createPerson的输入(input)参数,用于resolve解析函数。
mutate是这个Mutation调用的时候将要执行的方法。
现在我们可以这样定义我们的schema:
# ... the Mutation Class
class Person(graphene.ObjectType):
name = graphene.String()
age = graphene.Int()
class MyMutations(graphene.ObjectType):
create_person = CreatePerson.Field()
# We must define a query for our schema
class Query(graphene.ObjectType):
person = graphene.Field(Person)
schema = graphene.Schema(query=Query, mutation=MyMutations)
2、执行Mutations
schema.excute(queryStr):
queryStr如下:
mutation myFirstMutation {
createPerson(name:"Peter") {
person {
name
}
ok
}
}
我们将要收到:
{
"createPerson": {
"person" : {
"name": "Peter"
},
"ok": true
}
}
3、输入字段和输入字段类graphene.InputObjectType。
当输入字段较多的时候可以单独的创建一个输入字段类。
import graphene
class PersonInput(graphene.InputObjectType):
name = graphene.String(required=True)
age = graphene.Int(required=True)
class CreatePerson(graphene.Mutation):
class Arguments:
person_data = PersonInput(required=True)
person = graphene.Field(Person)
@staticmethod
def mutate(root, info, person_data=None):
person = Person(
name=person_data.name,
age=person_data.age
)
return CreatePerson(person=person)
使用输入字段类后的查询将变成:
mutation myFirstMutation {
createPerson(personData: {name:"Peter", age: 24}) {
person {
name,
age
}
}
}
输入字段类可以嵌套,形成复杂的输入字段
import graphene
class LatLngInput(graphene.InputObjectType):
lat = graphene.Float()
lng = graphene.Float()
#A location has a latlng associated to it
class LocationInput(graphene.InputObjectType):
name = graphene.String()
latlng = graphene.InputField(LatLngInput)
4、输出已有类型
使用Output
import graphene
class CreatePerson(graphene.Mutation):
class Arguments:
name = graphene.String()
Output = Person
def mutate(self, info, name):
return Person(name=name)
使用查询:
mutation myFirstMutation {
createPerson(name:"Peter") {
name
__typename
}
}
这时直接在createPerson后跟的就是name了,少了person这一层
结果:
{
"createPerson": {
"name": "Peter",
"__typename": "Person"
}
}
浙公网安备 33010602011771号