Мутации(Mutations)

Мутация это специальный объектный тип ObjectType, который также определяет входные данные Input.

Пример

Пример описывает мутацию Mutation:

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)

person и ok это поля вывода данных мутации Mutation.

Входные данные Input - это аргументы, которые необходимы мутации CreatePerson для вывода данных, в данном случае name будет единственным аргументом мутации.

mutate это метод, котоырй будет использоваться при вызове мутации.

Итак можно закончить схему так:

# ... 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)

Выполнение мутации

Теперь, если мы запросим следующее (schema.execute(query_str)):

mutation myFirstMutation {
    createPerson(name:"Peter") {
        person {
            name
        }
        ok
    }
}
We should receive:

Мы получим:

{
    "createPerson": {
        "person" : {
            name: "Peter"
        },
        "ok": true
    }
}

Поля ввода (InputFields) и типы ввода (InputObjectTypes)

InputFields используются в мутациях, чтобы разрешить использование вложенных входных данных для мутаций.

Для использования InputField Вы определяете 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)

Обратите внимани, что name и age теперь являются частью person_data.

Используя вышеууказанную мутацию, новый запрос будет выглядеть следующим образом:

mutation myFirstMutation {
    createPerson(personData: {name:"Peter", age: 24}) {
        person {
            name,
            age
        }
    }
}

InputObjectTypes так же могут быть полями InputObjectTypes, позволяя Вам иметь столько входных данных, сколько нужно.

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)

results matching ""

    No results matching ""