You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GraphQL中返回Enum值时遭遇‘Unhashable type: 'EnumMeta'’错误的问题咨询

解决Graphene中返回Enum值时的"unhashable type: 'EnumMeta'"错误

首先来说说你遇到的问题根源:你在解析器里返回的{EnumType.APPLE: 1}这种字典结构有两个问题:一是EnumType的成员属于不可哈希的类型(也就是不能当字典的键),二是你定义的FruitType.fruits字段是List(EnumType)类型,但你传进去的是字典列表,类型完全不匹配,这才触发了错误。

根据你想展示"可用于后续查询参数的有效选项"这个需求,我给你两种可行的实现方案:

方案1:直接返回枚举值名称列表(最简单的方式)

如果只是想让客户端知道可选的枚举参数有哪些,直接返回Enum成员即可,Graphene会自动把它们序列化为枚举名称字符串:

修改后的代码

import graphene

# 保留原Enum定义
class EnumType(graphene.Enum):
    APPLE = 1
    ORANGE = 2
    MANGO = 3

class FruitType(graphene.ObjectType):
    # 字段类型保持List(EnumType)不变
    fruits = graphene.List(EnumType, required=True)

class MyQuery(graphene.ObjectType):
    get_fruits = graphene.Field(FruitType)

    def resolve_get_fruits(self, info):
        # 直接返回Enum的成员列表,不需要字典
        return FruitType(fruits=[EnumType.APPLE, EnumType.ORANGE, EnumType.MANGO])

查询结果

执行{ getFruits { fruits } }会得到:

{
  "data": {
    "getFruits": {
      "fruits": ["APPLE", "ORANGE", "MANGO"]
    }
  }
}

客户端拿到这些字符串后,就可以直接作为后续查询的枚举参数使用。

方案2:返回包含名称和值的键值对(匹配你期望的输出结构)

如果你确实需要同时返回枚举的名称和对应数值,需要定义一个专门的ObjectType来承载这两个字段,因为GraphQL不支持动态键的结构(必须明确字段定义):

修改后的代码

import graphene

class EnumType(graphene.Enum):
    APPLE = 1
    ORANGE = 2
    MANGO = 3

# 定义一个专门的类型,用来返回枚举的名称和值
class FruitOptionType(graphene.ObjectType):
    name = graphene.String(required=True)
    value = graphene.Int(required=True)

class FruitType(graphene.ObjectType):
    # 字段类型改为List(FruitOptionType)
    fruits = graphene.List(FruitOptionType, required=True)

class MyQuery(graphene.ObjectType):
    get_fruits = graphene.Field(FruitType)

    def resolve_get_fruits(self, info):
        # 遍历Enum成员,生成FruitOptionType实例列表
        fruit_options = []
        for member in EnumType:
            fruit_options.append(FruitOptionType(name=member.name, value=member.value))
        return FruitType(fruits=fruit_options)

查询结果

执行{ getFruits { fruits { name value } } }会得到:

{
  "data": {
    "getFruits": {
      "fruits": [
        {
          "name": "APPLE",
          "value": 1
        },
        {
          "name": "ORANGE",
          "value": 2
        },
        {
          "name": "MANGO",
          "value": 3
        }
      ]
    }
  }
}

这个结构既清晰又符合GraphQL的类型规范,客户端能明确拿到每个枚举选项的名称和对应值。

内容的提问来源于stack exchange,提问作者Ahtisham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:12:35