Графен: аргумент 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

Команда с использованием ПОЧТАЛЬОН:

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

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

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

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

command недопустимый питон, как вы звоните command?

Devesh Kumar Singh 22.05.2019 16:57

Нет, это вполне справедливо. Проверьте здесь, и я использую почтальона stackoverflow.com/a/55146271/6143656

Roel 22.05.2019 17:00

@MarcoDaniel Выглядит хорошо

Roel 22.05.2019 17:02

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

Daniel Rearden 22.05.2019 17:11

Когда я напечатал kwargs на def mutate(), аргумент enum_arg имеет значение 1. Теперь проблема последствий заключается в том, что я использую flask-sqlalchemy, а поле модели представляет собой перечисление. он не может принять значение 1, поскольку он дает Not a valid enum value. Я ожидал, что это должно дать <EnumArg.Bar: 1>.

Roel 22.05.2019 17:16

@DanielRearden, однако, решает проблему исходной ошибки, из-за которой он даже не может продолжить работу с функцией мутации.

Roel 22.05.2019 17:17

@Roel Это, наверное, хороший вопрос, но, к сожалению, я не могу ответить, так как у меня нет опыта работы с flask-sqlalchemy. Я бы предложил открыть новый вопрос.

Daniel Rearden 22.05.2019 17:22
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
5
7
4 460
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

mutation {
  createPerson(enumArg: Bar) {
    foo
  }
}

И да, это довольно точное и подробное объяснение.

Roel 22.05.2019 17:28

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

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

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

Другие вопросы по теме