Узлы (Nodes)¶
Узел Node
это интерфейс, предоставляемый graphene.relay
, который содержит одно поле id
(типа ID
). Любой объект, унаследованный от него, обязан иметь метод get_node
для доступа к узлу Node
по идентификатору id
.
Пример¶
Пример использования (взято из Starwars Relay example):
class Ship(graphene.ObjectType):
'''A ship in the Star Wars saga'''
class Meta:
interfaces = (relay.Node, )
name = graphene.String(description='The name of the ship.')
@classmethod
def get_node(cls, info, id):
return get_ship(id)
id
, возвращенное объектным типом Ship
в результате запроса, будет скаляром scalar
, содержащим достаточно информации о его типе и его id.
Например, сущность Ship(id=1)
вернет U2hpcDox
как id (Ship:1
в кодировке base64).
Кастомные узлы (Nodes)¶
Вы можете использоватьrelay.Node
или сделать его подкласс, определив как id
узла будет закодирован (используя в классе методto_global_id
) или как мы будем получать закодированный id
(используя методget_node_from_global_id
).
Пример кастомного узла:
class CustomNode(Node):
class Meta:
name = 'Node'
@staticmethod
def to_global_id(type, id):
return '{}:{}'.format(type, id)
@staticmethod
def get_node_from_global_id(info global_id, only_type=None):
type, id = global_id.split(':')
if only_node:
# We assure that the node type that we want to retrieve
# is the same that was indicated in the field type
assert type == only_node._meta.name, 'Received not compatible node.'
if type == 'User':
return get_user(id)
elif type == 'Photo':
return get_photo(id)
Методget_node_from_global_id
будет вызван во время резолва поляCustomNode.Field
.
Доступ к типам узлов¶
Если мы хотим получать сущности Node
из global_id
, то можно просто сделать так: Node.get_node_from_global_id(global_id,context,info)
.
В случае, если мы хотим ограничить получение сущностей по типу, то можно сделать так:
Node.get_node_from_global_id(global_id,context,info,only_type=Ship)
.
Это вызовет ошибку, если global_id
не отвечает типу Ship
Root-поле узла (Node)¶
Согласно требованиям Relay specification сервер должен иметь root-поле, называемое node
, которое вовращает интерфейс Node
.
По этой причине graphene
предоставляет поле relay.Node.Field
, которое связывает любые типы в схеме (с имплементированным Node
).
Пример использования:
class Query(graphene.ObjectType):
# Should be CustomNode.Field() if we want to use our custom Node
node = relay.Node.Field()