我已经实现了 graphql 并且我正在迁移到中继。我已经为每个表创建了一个 uuid,名为“id”。我的应用程序我发现了这个 github 线程,它讨论了可能会更改规范,但感觉就像一个兔子洞。
有没有一种简单的方法可以将我自己的自定义 ID 与中继一起使用?
如果您已经实现了默认中继端点,那么您应该有一些TableNameNode具有Meta嵌套类和单独的 Query 类的类。
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
Run Code Online (Sandbox Code Playgroud)
它interface = (relay.Node,)定义了 1) 如何生成 id 以及 2) 如何使用它们来获取数据。如果我们创建一个relay.Node重新定义这两个功能的子类,那么我们可以使用我们的自定义 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)
Run Code Online (Sandbox Code Playgroud)
这里我们实现了两个函数,to_global_id 和 get_node_from_global_id。model = ...从 graphql 查询表名称到实际模型的行有点神奇。如果这不起作用,你只需要制作一个字典来从类似的东西变成example_table_name实际的ExampleTableNamedjango 模型。
一旦你这样做,你必须在两个引用替换对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
Run Code Online (Sandbox Code Playgroud)
答案在石墨烯文档中。我在实施石墨烯和中继时阅读了它们,但是一次要学习的东西太多了,很容易通读自定义节点部分,以后不记得你需要做一个自定义节点解决方案。
| 归档时间: |
|
| 查看次数: |
2421 次 |
| 最近记录: |