如何在 Graphene 和 Relay 中使用自定义 ID?

muc*_*le6 3 graphene-python

我已经实现了 graphql 并且我正在迁移到中继。我已经为每个表创建了一个 uuid,名为“id”。我的应用程序我发现了这个 github 线程,它讨论了可能会更改规范,但感觉就像一个兔子洞。

有没有一种简单的方法可以将我自己的自定义 ID 与中继一起使用?

muc*_*le6 7

如果您已经实现了默认中继端点,那么您应该有一些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.NodeCustomNode像这样。

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)

答案在石墨烯文档中。我在实施石墨烯和中继时阅读了它们,但是一次要学习的东西太多了,很容易通读自定义节点部分,以后不记得你需要做一个自定义节点解决方案。