【问题标题】:Graphene: Enum argument doesn't seem to work石墨烯:枚举参数似乎不起作用
【发布时间】:2019-10-09 02:39:56
【问题描述】:

我目前在突变枚举 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.",

我还尝试在createPerson 突变上提供enumArg=\"Bar\",但错误仍然存​​在。

【问题讨论】:

  • command 无效 python 你怎么称呼command
  • 不,它非常有效。在这里检查并使用邮递员stackoverflow.com/a/55146271/6143656
  • @MarcoDaniel 看起来不错
  • 不确定这是不是骗子。这里的问题是我们可以为每个枚举值分配一个任意值,但这个值仅由 GraphQL 服务本身在内部使用。在 GraphQL 文档中引用枚举值时,必须始终通过其名称来引用。
  • @Roel 这可能是一个好问题,不幸的是我无法回答,因为我没有使用flask-sqlalchemy 的经验。我建议打开一个新问题。

标签: python graphql graphene-python


【解决方案1】:

在定义枚举时,我们可以为枚举中的每个枚举值分配一个任意值。但是,此值仅由 GraphQL 服务本身在内部使用。例如,如果字段参数的类型是枚举,则该值将作为参数值传递给字段的解析器。但是,在编写 GraphQL 文档时,枚举值必须始终通过它的名称而不是它的值来引用。

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

【讨论】:

  • 是的,这是非常准确且非常详细的解释。
【解决方案2】:

在后端定义的枚举是:

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 突变中的性别类型(即枚举),就像我上面所做的那样。

请阅读我在此链接上的回答Link for reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2021-12-22
    • 2021-08-24
    • 2020-11-02
    • 2017-05-11
    • 2022-01-24
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多