Skip to content

Commit e92b03b

Browse files
committed
Allow Node inner types to be lazy. Fixed #437
1 parent 5f71ac7 commit e92b03b

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

graphene/relay/node.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from graphql_relay import from_global_id, to_global_id
66

77
from ..types import ID, Field, Interface, ObjectType
8+
from ..types.utils import get_type
89
from ..types.interface import InterfaceMeta
910

1011

@@ -64,17 +65,18 @@ def __init__(self, node, type=False, deprecation_reason=None,
6465
name=None, **kwargs):
6566
assert issubclass(node, Node), 'NodeField can only operate in Nodes'
6667
self.node_type = node
67-
68-
# If we don's specify a type, the field type will be the node interface
69-
field_type = type or node
68+
self.field_type = type
7069

7170
super(NodeField, self).__init__(
72-
field_type,
71+
# If we don's specify a type, the field type will be the node interface
72+
type or node,
7373
description='The ID of the object',
74-
id=ID(required=True),
75-
resolver=partial(node.node_resolver, only_type=type)
74+
id=ID(required=True)
7675
)
7776

77+
def get_resolver(self, parent_resolver):
78+
return partial(self.node_type.node_resolver, only_type=get_type(self.field_type))
79+
7880

7981
class Node(six.with_metaclass(NodeMeta, Interface)):
8082
'''An object with an ID'''

graphene/relay/tests/test_node.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class RootQuery(ObjectType):
4545
first = String()
4646
node = Node.Field()
4747
only_node = Node.Field(MyNode)
48+
only_node_lazy = Node.Field(lambda: MyNode)
4849

4950
schema = Schema(query=RootQuery, types=[MyNode, MyOtherNode])
5051

@@ -116,6 +117,23 @@ def test_node_field_only_type_wrong():
116117
assert executed.data == { 'onlyNode': None }
117118

118119

120+
def test_node_field_only_lazy_type():
121+
executed = schema.execute(
122+
'{ onlyNodeLazy(id:"%s") { __typename, name } } ' % Node.to_global_id("MyNode", 1)
123+
)
124+
assert not executed.errors
125+
assert executed.data == {'onlyNodeLazy': {'__typename': 'MyNode', 'name': '1'}}
126+
127+
128+
def test_node_field_only_lazy_type_wrong():
129+
executed = schema.execute(
130+
'{ onlyNodeLazy(id:"%s") { __typename, name } } ' % Node.to_global_id("MyOtherNode", 1)
131+
)
132+
assert len(executed.errors) == 1
133+
assert str(executed.errors[0]) == 'Must receive an MyOtherNode id.'
134+
assert executed.data == { 'onlyNodeLazy': None }
135+
136+
119137
def test_str_schema():
120138
assert str(schema) == """
121139
schema {
@@ -142,5 +160,6 @@ def test_str_schema():
142160
first: String
143161
node(id: ID!): Node
144162
onlyNode(id: ID!): MyNode
163+
onlyNodeLazy(id: ID!): MyNode
145164
}
146165
""".lstrip()

0 commit comments

Comments
 (0)