如何在 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,) 定义:

  1. 如何生成 ID
  2. 如何使用它们来获取数据

如果我们创建一个 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_idget_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中。我在实施时阅读了它们 石墨烯和继电器,但一次要学的东西太多了,读起来很容易 通过自定义节点部分,以后不记得你需要做一个自定义 节点解决方案。