如何在 Graphene 和 Relay 中使用自定义 ID?
How to use a custom id with Graphene and Relay?
我已经实现了 graphql,并且正在迁移到中继。我已经为每个 table 设置了一个 uuid,并命名为 'id'。在我的应用程序中,我发现 this github thread 谈到可能会更改规范,但感觉就像一个兔子洞。
有没有一种简单的方法可以让我在中继中使用我自己的自定义 ID?
如果您已经实现了默认中继端点,那么您应该有一些
TableNameNode
class 有一个 Meta
嵌套 class 和一个单独的查询
class.
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,)
定义:
- 如何生成 ID
- 如何使用它们来获取数据
如果我们创建一个 relay.Node
subclass 来重新定义这两个功能,那么我们就可以使用我们的自定义 ID。
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
。
从 graphql 查询 table 名称中提取 model = ...
行有点神奇
到实际模型。如果这不起作用,你只需要制作一本字典
从 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
答案就在graphene docs中。我在实施时阅读了它们
石墨烯和继电器,但一次要学的东西太多了,读起来很容易
通过自定义节点部分,以后不记得你需要做一个自定义
节点解决方案。
我已经实现了 graphql,并且正在迁移到中继。我已经为每个 table 设置了一个 uuid,并命名为 'id'。在我的应用程序中,我发现 this github thread 谈到可能会更改规范,但感觉就像一个兔子洞。
有没有一种简单的方法可以让我在中继中使用我自己的自定义 ID?
如果您已经实现了默认中继端点,那么您应该有一些
TableNameNode
class 有一个 Meta
嵌套 class 和一个单独的查询
class.
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,)
定义:
- 如何生成 ID
- 如何使用它们来获取数据
如果我们创建一个 relay.Node
subclass 来重新定义这两个功能,那么我们就可以使用我们的自定义 ID。
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
。
从 graphql 查询 table 名称中提取 model = ...
行有点神奇
到实际模型。如果这不起作用,你只需要制作一本字典
从 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
答案就在graphene docs中。我在实施时阅读了它们 石墨烯和继电器,但一次要学的东西太多了,读起来很容易 通过自定义节点部分,以后不记得你需要做一个自定义 节点解决方案。