使用Graphene

问题描述

这是使用Python和Graphene库的。

我想通过GraphQL向我的前端提供一个常量列表。我走了使用检查的路线,但是它只会输出枚举的键。不是值。我了解到石墨烯枚举仅包含名称/描述。

    {
      __type(name: "FruitEnum") {
        enumValues {
          name
          description
        }
      }
    }

这将返回

{
  "data": {
    "__type": {
      "enumValues": [
        {
          "name": "APPLE","description": null
        },{
          "name": "BANANA",{
          "name": "ORANGE","description": null
        }
      ]
    }
  },"errors": null
}

这是实际枚举的样子

class FruitEnum(Enum):
    APPLE = "Apple -- but Could also be other information for the front end"
    BANANA = "Banana"
    ORANGE = "Orange"

是否有通过GraphQL公开这样的常量列表的首选方法?可以使用解析器修改自省以读取值吗?我正在使用常规的Python枚举,并使用Enum.from_enum函数将其注册到Graphene。

解决方法

我认为您不是从 enumValues 中添加或删除字段的人,因为这是标准操作。

但是,您可以通过在枚举类中指定 description property 来添加描述。

import graphene

from enum import Enum as PyEnum


class FruitEnum(PyEnum):
    APPLE = "Apple"
    BANANA = "Banana"
    ORANGE = "Orange"

    def get_field_description(self):
        mapper = {
            "default": "default description","APPLE": "Apple description"
        }
        return mapper.get(self.name,mapper['default'])

    @property
    def description(self):
        return self.get_field_description()


class FruitType(graphene.ObjectType):
    foo = graphene.Enum.from_enum(FruitEnum)()

因此,您将得到一个响应,

{
  "data": {
    "__type": {
      "name": "FruitEnum","enumValues": [
        {
          "name": "APPLE","description": "Apple description"
        },{
          "name": "BANANA","description": "default description"
        },{
          "name": "ORANGE","description": "default description"
        }
      ]
    }
  }
}