Мутации(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)