咨询:Django Graphene未包含模型中名为type的字段问题
问题分析
你遇到的这个情况太典型了——type是GraphQL和Graphene-Django的保留关键字,自动生成DjangoObjectType的时候,框架会自动跳过这个字段,避免和GraphQL内置的__type元字段冲突。这就是为什么你在Resolver里能拿到值,但GraphiQL里却提示“无法查询该字段”的核心原因。
解决办法
这里有两种可行的方案,你可以根据需求选择:
方案1:重命名GraphQL字段(推荐)
最简单的方式是给GraphQL里的字段换个名字,映射到模型的type字段,比如叫post_type:
from graphene_django import DjangoObjectType import graphene from .models import Post class PostType(DjangoObjectType): # 显式定义字段,source指向模型的type字段 post_type = graphene.Field(graphene.String, source='type') class Meta: model = Post # 要么用__all__,要么列出需要的字段(包括post_type) fields = "__all__"
之后你在GraphiQL里查询post_type就能拿到模型中type字段的值了,完全避开关键字冲突。
方案2:强制保留type字段名
如果你一定要在GraphQL里用type作为字段名,那需要手动定义字段和Resolver,绕开自动生成的逻辑:
class PostType(DjangoObjectType): # 手动定义type字段 type = graphene.Field(graphene.String) # 自定义Resolver返回模型的type值 def resolve_type(self, info): return self.type class Meta: model = Post # 排除自动生成的type字段,避免冲突 exclude = ('type',)
这样框架就不会自动处理type字段,而是用你自定义的Resolver来返回值。
额外排查点
如果上面的方案没解决,你可以再检查这两个地方:
- 确认模型里的
type字段没有设置editable=False或者其他特殊元选项,导致Graphene无法识别(不过你说和issuer字段一致,这个可能性很低); - 检查
DjangoObjectType的Meta类里,是不是不小心把type加到了exclude列表里。
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

