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

  

 

posted @ 2018-08-30 11:55  tutu_python  阅读(560)  评论(0)    收藏  举报