如何使用Relay Connection(Graphene Python)实现节点自关联?
解决Graphene中Relay自关联连接的循环依赖问题
嘿,我完全懂你碰到的这个麻烦——在Graphene里定义用户和好友这种自关联的Relay连接时,确实很容易陷入循环依赖的坑,毕竟UserNode要用到FriendConnection,而FriendConnection又得指定node为UserNode,Python顺序执行的特性就会让这个前置定义的问题凸显出来。别担心,这是新手常遇到的情况,有两种简单的解决办法:
方法一:使用字符串引用连接类(推荐)
Graphene支持在定义ConnectionField时用字符串来指代连接类,这样就不用在定义UserNode的时候必须先有FriendConnection的定义了。修改你的UserNode代码:
class UserNode(graphene.ObjectType): class Meta: interfaces = (relay.Node, ) name = graphene.String() # 用字符串"FriendConnection"替代直接引用类 friends = relay.ConnectionField("FriendConnection")
之后再正常定义FriendConnection即可:
class FriendConnection(relay.Connection): class Meta: node = UserNode
Graphene会在整个Schema构建完成后,自动根据字符串找到对应的连接类,完美避开循环依赖的问题。
方法二:延迟设置连接类的node属性
如果你更倾向于用类引用而不是字符串,可以先定义一个空的连接类,等UserNode定义完成后再补全node属性:
# 先定义没有指定node的连接类 class FriendConnection(relay.Connection): class Meta: node = None # 定义UserNode,此时可以直接引用FriendConnection class UserNode(graphene.ObjectType): class Meta: interfaces = (relay.Node, ) name = graphene.String() friends = relay.ConnectionField(FriendConnection) # 最后补全FriendConnection的node属性 FriendConnection._meta.node = UserNode
额外提示:别忘了实现Resolver
解决了定义问题后,你还需要给friends字段添加Resolver来实际获取好友数据,比如:
class UserNode(graphene.ObjectType): # ... 其他字段和Meta定义 ... friends = relay.ConnectionField("FriendConnection") def resolve_friends(self, info, **kwargs): # 这里替换成你实际获取用户好友的逻辑,比如从数据库查询 sample_friends = [ UserNode(id="1", name="Alice", age=25), UserNode(id="2", name="Bob", age=27) ] # 使用relay.connection_from_list处理分页参数(first/after等) return relay.connection_from_list(sample_friends, info, **kwargs)
这样你的自关联Relay连接就能正常工作啦,和你在官方文档里看到的GraphQL片段对应上了。
内容的提问来源于stack exchange,提问作者André Krosby
相关产品推荐
相关产品推荐

