Как использовать пользовательский идентификатор с графеном и реле? - PullRequest
0 голосов
/ 30 ноября 2018

Я реализовал graphql и перехожу на ретрансляцию.У меня уже есть uuid для каждой таблицы, и она называется id.И мое приложение я нашел этот поток GitHub , который говорит о возможном изменении спецификации, но это похоже на кроличью нору.

Есть ли простой способ, которым я могу использовать свой собственный идентификатор с реле

1 Ответ

0 голосов
/ 30 ноября 2018

Если вы уже внедрили конечную точку ретрансляции по умолчанию, у вас должно быть несколько классов TableNameNode, которые имеют вложенный класс Meta и отдельный класс запросов.

class ExampleTableNameNode(DjangoObjectType):
    class Meta:
        model = ExampleTableName
        interface = (relay.Node,)

class Query(object):
    example_table_name = relay.Node.Field(ExampleTableNameNode)
    all_example_table_names = DjangoFilterConnectionField(ExampleTableNameNode)

    def resolve_example_table_name(self, info, **kwargs):
        pass

    def resolve_all_example_table_names(self, info, **kwargs):
        pass

interface = (relay.Node,)это то, что определяет 1) как генерируются идентификаторы и 2) как они используются для выборки данных.Если мы создадим подкласс relay.Node, который переопределяет эти две функции, то мы можем использовать наши собственные идентификаторы.

class CustomNode(relay.Node): 
    class Meta:
        name = 'Node'

    @staticmethod
    def to_global_id(type, id):
        #returns a non-encoded ID
        return id

    @staticmethod
    def get_node_from_global_id(info, global_id, only_type=None):
        model = getattr(Query,info.field_name).field_type._meta.model
        return model.objects.get(id=global_id)

Здесь мы реализовали две функции, to_global_id и get_node_from_global_id.Строка model = ... немного волшебна, чтобы перейти от имени таблицы запросов graphql к реальной модели.Если это не сработает, вам просто нужно создать словарь, чтобы перейти от чего-то вроде example_table_name к фактической модели ExampleTableName django.

Как только вы это сделаете, вам придется заменить две ссылки на relay.Node на CustomNode примерно так.

class ExampleTableNameNode(DjangoObjectType):
    class Meta:
        model = ExampleTableName
        interface = (CustomNode,)

class Query(object):
    example_table_name = CustomNode.Field(ExampleTableNameNode)
    all_example_table_names = DjangoFilterConnectionField(ExampleTableNameNode)

    def resolve_example_table_name(self, info, **kwargs):
        pass

    def resolve_all_example_table_names(self, info, **kwargs):
        pass

Ответ есть в графеновых документах .Я читал их, когда внедрял графен и ретранслятор, но за один раз можно многому научиться, так что вы легко читаете раздел пользовательских узлов и не вспоминаете позже, что вам нужно создать решение для пользовательских узлов.

...