Если вы уже внедрили конечную точку ретрансляции по умолчанию, у вас должно быть несколько классов 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
Ответ есть в графеновых документах .Я читал их, когда внедрял графен и ретранслятор, но за один раз можно многому научиться, так что вы легко читаете раздел пользовательских узлов и не вспоминаете позже, что вам нужно создать решение для пользовательских узлов.