Невозможно вернуть ноль для ошибки, не равной нулю, с мутациями в форме графена
Я пробую пример графена-джанго с формами. Но я получаю следующую ошибку:
`graphql.error.base.GraphQLError: Невозможно вернуть ноль для не обнуляемого поля [MyMutationPayload.name].
Я пытался установить значения в выражении возврата внутри функции execute_mutate. Это не работает, если запрос не выполняет все варианты.
class MyForm(forms.Form):
name = forms.CharField(min_length=10)
age = forms.IntegerField(min_value=0)
birth_date = forms.DateField()
class MyMutation(DjangoFormMutation):
class Meta:
form_class = MyForm
@classmethod
def perform_mutate(cls, form, info):
print('ok')
return cls(errors=[], name=form.cleaned_data.get('name'), age=form.cleaned_data.get('age'), birth_date=form.cleaned_data.get('birth_date'))
class Mutations():
my_mutation = MyMutation.Field()
class Mutation(Mutations, ObjectType):
pass
ROOT_SCHEMA = Schema(mutation=Mutation)
запрос
mutation customMutation($data: MyMutationInput!){
myMutation(input: $data){
name
age
birthDate
errors{
field
messages
}
clientMutationId
}
}
переменные
{
"data": {
"name": "Cristhiam",
"age": "-29",
"birthDate": "1990-04-06"
}
}
отклик
{
"errors": [
{
"message": "Cannot return null for non-nullable field MyMutationPayload.name.",
"locations": [
{
"line": 3,
"column": 5
}
],
"path": [
"myMutation",
"name"
]
}
],
"data": {
"myMutation": null
}
}
Результат мутации должен показать все ошибки или все значения формы.
1 ответ
Измените свой код, как следует
class MyForm(forms.Form):
name = forms.CharField(min_length=10)
age = forms.IntegerField(min_value=0)
birth_date = forms.DateField()
class MyMutation(DjangoFormMutation):
class Meta:
form_class = MyForm
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
print('ok')
return cls(errors=[], name=input.get('name'), age=input.get('age'), birth_date=input.get('birth_date'))
class Mutations(ObjectType):
my_mutation = MyMutation.Field()
class Mutation(Mutations, ObjectType):
pass
ROOT_SCHEMA = Schema(mutation=Mutation)
input - это аргумент, который передается мутации в соответствии с их документацией.
Это сработало:
@classmethod
def perform_mutate(cls, form, info):
super().perform_mutate(form, info)
return cls(errors=[], **form.cleaned_data)