mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 20:54:16 +03:00
Added node resolver
This commit is contained in:
parent
1820a4eb60
commit
a55741b03c
|
@ -50,20 +50,29 @@ class NodeMeta(InterfaceMeta):
|
||||||
return cls
|
return cls
|
||||||
|
|
||||||
|
|
||||||
|
class NodeField(Field):
|
||||||
|
def __init__(self, node, type=False, deprecation_reason=None,
|
||||||
|
name=None, **kwargs):
|
||||||
|
assert issubclass(node, Node), 'NodeField can only operate in Nodes'
|
||||||
|
type = type or node
|
||||||
|
super(NodeField, self).__init__(
|
||||||
|
type,
|
||||||
|
description='The ID of the object',
|
||||||
|
id=ID(required=True),
|
||||||
|
resolver=node.node_resolver
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Node(six.with_metaclass(NodeMeta, Interface)):
|
class Node(six.with_metaclass(NodeMeta, Interface)):
|
||||||
'''An object with an ID'''
|
'''An object with an ID'''
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def Field(cls): # noqa: N802
|
def Field(cls, *args, **kwargs): # noqa: N802
|
||||||
def resolve_node(root, args, context, info):
|
return NodeField(cls, *args, **kwargs)
|
||||||
return cls.get_node_from_global_id(args.get('id'), context, info)
|
|
||||||
|
|
||||||
return Field(
|
@classmethod
|
||||||
cls,
|
def node_resolver(cls, root, args, context, info):
|
||||||
description='The ID of the object',
|
return cls.get_node_from_global_id(args.get('id'), context, info)
|
||||||
id=ID(required=True),
|
|
||||||
resolver=resolve_node
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_node_from_global_id(cls, global_id, context, info):
|
def get_node_from_global_id(cls, global_id, context, info):
|
||||||
|
|
|
@ -239,6 +239,8 @@ class TypeMap(GraphQLTypeMap):
|
||||||
# find it in each of the interfaces
|
# find it in each of the interfaces
|
||||||
interface_resolver = None
|
interface_resolver = None
|
||||||
for interface in type._meta.interfaces:
|
for interface in type._meta.interfaces:
|
||||||
|
if name not in interface._meta.fields:
|
||||||
|
continue
|
||||||
interface_resolver = getattr(interface, 'resolve_{}'.format(name), None)
|
interface_resolver = getattr(interface, 'resolve_{}'.format(name), None)
|
||||||
if interface_resolver:
|
if interface_resolver:
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in New Issue
Block a user