Графен: аргумент Enum, похоже, не работает

В настоящее время у меня проблемы с перечислением мутаций Argument.

Ниже мой код для Mutation:

class CreatePerson(graphene.Mutation):
    foo = graphene.String()

    def mutate(self, info, **kwargs):
        return CreatePerson(foo='foo')


    class Arguments:
        enum_arg = graphene.Argument(graphene.Enum.from_enum(EnumArg))

Класс перечисления:

from enum import Enum

class EnumArg(Enum):
    Baz = 0
    Bar = 1
    Spam = 2
    Egg = 3

Команда с использованием POSTMAN:

{
    "query": "mutation": {createPerson(enumArg=1) { foo }}
}

Но я получаю это сообщение об ошибке:

"message": "Argument \"enumArg\" has invalid value 1.
            Expected type \"EnumArg\", found 1.",

Я также пытался дать enumArg=\"Bar\" мутации createPerson, и ошибка все еще сохраняется.


person Roel    schedule 22.05.2019    source источник
comment
command недопустимый питон, как вы вызываете command?   -  person Devesh Kumar Singh    schedule 22.05.2019
comment
Нет, это вполне справедливо. Проверьте здесь, и я использую почтальона stackoverflow.com/a/55146271/6143656   -  person Roel    schedule 22.05.2019
comment
@MarcoDaniel Выглядит хорошо   -  person Roel    schedule 22.05.2019
comment
Не уверен, что это обман. Проблема здесь в том, что мы можем назначить произвольное значение для каждого значения перечисления, но это значение используется только внутренне самой службой GraphQL. При обращении к значению перечисления внутри документа GraphQL на него всегда нужно ссылаться по его имени.   -  person Daniel Rearden    schedule 22.05.2019
comment
Когда я напечатал kwargs на def mutate(), аргумент enum_arg имеет значение 1. Теперь проблема последствий заключается в том, что я использую flask-sqlalchemy, а поле модели представляет собой перечисление. он не может принять значение 1, так как дает Not a valid enum value. Я ожидал, что он должен дать <EnumArg.Bar: 1>.   -  person Roel    schedule 22.05.2019
comment
@DanielRearden, однако, решает проблему исходной ошибки, из-за которой он даже не может продолжить работу с функцией мутации.   -  person Roel    schedule 22.05.2019
comment
@Roel Вероятно, это хороший вопрос, но, к сожалению, я не могу ответить, так как у меня нет опыта работы с flask-sqlalchemy. Я бы предложил открыть новый вопрос.   -  person Daniel Rearden    schedule 22.05.2019


Ответы (2)


При определении перечисления мы можем присвоить произвольное значение каждому значению перечисления в перечислении. Однако это значение используется только внутри самой службы GraphQL. Например, если типом аргумента поля является перечисление, это значение будет передано преобразователю поля в качестве значения аргумента. Однако при составлении документа GraphQL значение перечисления всегда должно упоминаться по имени, а не по значению.

mutation {
  createPerson(enumArg: Bar) {
    foo
  }
}
person Daniel Rearden    schedule 22.05.2019
comment
И да, это довольно точное и подробное объяснение. - person Roel; 22.05.2019

enum, определенный в бэкэнде:

enum Gender {
  MALE
  FEMALE
}

Я использую Vue для внешнего интерфейса, поэтому передача данных в мутацию из Vue может быть выполнена следующим образом. Я определил пол как строку в моем локальном состоянии компонента как:

data(){
  return {
     gender: ''
  }
}

Метод из Vue:

async handleEditProfile () {
      const response = await this.$apollo.mutate({
        query: EDIT_PROFILE,
        variables: {
          nameAsInPan: this.nameAsInPan,
          gender: this.gender,
          dateOfBirth: this.dateOfBirth
        }
      })
    }

мутация, использованная выше EDIT_PROFILE:

gql`mutation editProfile($name: String!, $email: String!,$phone: String!, $gender: Gender!, $dateOfBirth: String!) {
    editProfile (profileInput:{name: $name, email: $email, phone: $phone, gender: $gender, dateOfBirth: $dateOfBirth}){
      id
      email
      phone
      firstName
      lastName
      nameAsInPan
      gender
      dateOfBirth
    }
}
`

используйте имя переменной enum, как определено в мутации, и отправьте его в Graphql, как я использовал пол As $gender: Gender! в мутации gql. Вам не нужно беспокоиться об отправке данных в виде перечисления, просто отправьте их как строку, иначе вам придется столкнуться с ошибкой JSON, Graphql позаботится о значении, которое вы отправляете в виде строки (например, «MALE» или «FEMALE») просто не забудьте упомянуть, что пол - это тип пола (который является перечислением) в мутации gql, как я сделал выше.

Пожалуйста, прочитайте мой ответ по этой ссылке Ссылка для справки

person Shivam Bisht    schedule 31.12.2019