运行relay-compiler报错:Query类型存在未知字段`edges`
嘿,我之前用graphene-django配合relay-compiler的时候也踩过不少坑,结合你给出的Schema代码片段,大概率是几个relay规范相关的配置没做到位,咱们一步步来排查解决:
Relay编译器对GraphQL Schema有严格的规范要求,而graphene-django需要完全贴合这些规范才能让编译流程正常运行。从你提供的代码来看,主要可以从以下几个方向检查:
1. 补全Query类的relay风格字段
你的Query类只写了def...,大概率是缺少了relay必须的核心查询字段。Relay要求查询根必须包含node字段(用于通过Relay ID获取单个节点),以及符合Connection规范的列表字段。正确的写法应该是:
from graphene import ObjectType import graphene from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField from .models import Tree class TreeNode(DjangoObjectType): class Meta: model = Tree filter_fields = ['owner'] interfaces = (graphene.relay.Node,) # 注意这里要导入graphene下的relay.Node,不是直接的relay模块 class Query(ObjectType): # 必须定义这个node字段,Relay编译器依赖它生成类型定义 node = graphene.relay.Node.Field() # 用ConnectionField暴露列表,符合Relay的分页规范 trees = DjangoFilterConnectionField(TreeNode) # 务必导出完整的Schema实例 schema = graphene.Schema(query=Query)
2. 确保Relay编译器能正确获取Schema
Relay-compiler需要读取标准的GraphQL Schema文件(.graphql)或者直接从运行中的GraphQL端点拉取Schema。如果用本地文件,你需要先把graphene-django的Schema导出成.graphql格式:
可以用Django的自定义命令导出:
python manage.py graphql_schema --schema grove.gql_schema.schema --out schema.graphql
然后在项目根目录的relay.config.js中配置路径:
module.exports = { src: "./src", schema: "./schema.graphql", exclude: ["**/node_modules/**", "**/__generated__/**"], };
3. 检查模型ID的兼容性
graphene-django的relay.Node接口会自动把模型主键编码成Relay标准的base64格式ID,但要确保你的Tree模型有合法的主键字段(默认的自增id就可以),如果是自定义主键,要保证它能被正常序列化为字符串。
4. 版本兼容性排查
不同版本的relay-compiler和graphene-django可能存在兼容性冲突,建议使用最新稳定版:
# 更新graphene-django pip install --upgrade graphene-django # 更新relay-compiler npm install --save-dev relay-compiler@latest
如果还是有报错,把具体的错误信息贴出来能更精准定位问题,但从目前的代码片段来看,以上几点是最可能的触发原因。
内容的提问来源于stack exchange,提问作者saturdayplace

