在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
相关产品推荐
相关产品推荐

