Graphene框架继承类Schema出现同名类型断言错误求助
解决Graphene SQLAlchemy中继承模型导致的字段类型重复冲突问题
这个错误的根源在于,当你的SalableProductModel继承自ProductModel时,共享的product_status字段会让Graphene自动生成同名的GraphQL类型,而Schema不允许存在重复名称的类型。下面是几种可行的解决方案:
方案1:手动重定义冲突字段并指定唯一类型名
你可以在SalableProduct类里重新定义product_status字段,通过name参数给它指定一个唯一的类型名称,避免和父模型的字段类型重名:
# Salable_product_schema.py class SalableProduct(SQLAlchemyObjectType): # 重新定义product_status,指定唯一的类型名称 product_status = graphene.String(name="salable_product_status") class Meta: model = SalableProductModel interfaces = (relay.Node, ) class SalableProductConnections(relay.Connection): class Meta: node = SalableProduct
这样一来,Product模型里的product_status对应GraphQL类型product_status,而SalableProduct里的对应salable_product_status,就不会有重复冲突了。
方案2:正确使用exclude_fields(如果不需要该字段)
如果你本来就想在SalableProduct中排除product_status字段,要确保exclude_fields是元组或列表格式(注意单元素元组末尾的逗号),否则不会生效:
class SalableProduct(SQLAlchemyObjectType): class Meta: model = SalableProductModel interfaces = (relay.Node, ) # 正确的exclude_fields格式,单元素要加逗号 exclude_fields = ("product_status",)
方案3:自定义字段类型映射
你也可以通过Meta类的fields参数,统一自定义所有字段的类型配置,明确指定冲突字段的唯一名称:
class SalableProduct(SQLAlchemyObjectType): class Meta: model = SalableProductModel interfaces = (relay.Node, ) fields = { "product_status": graphene.String(name="salable_product_status"), # 其他需要保留的字段可以列出,或者用"__all__"包含所有字段后再覆盖冲突字段 # "__all__": True, }
为什么会出现这个错误?
Graphene SQLAlchemy默认会根据模型字段的名称生成对应的GraphQL类型名称,当两个模型(即使是继承关系)拥有同名字段时,生成的类型名称会重复,而GraphQL Schema要求所有类型名称必须唯一,因此触发了AssertionError。通过手动指定字段的name参数,我们可以让每个字段生成唯一的类型,从而解决冲突。
内容的提问来源于stack exchange,提问作者Rafik Belkadi
相关产品推荐
相关产品推荐

