Узлы (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()

results matching ""

    No results matching ""