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

时间:2018-11-30 16:19:17

标签: graphene-python

我已经实现了graphql,并且正在迁移以进​​行中继。我已经为每个表创建了一个uuid,并将其命名为“ id”。在我的应用程序中,我发现this github thread谈到可能会更改规格,但感觉就像一个兔子洞。

是否可以通过中继使用自己的自定义ID?

1 个答案:

答案 0 :(得分:1)

如果您已经实现了默认的中继终结点,则应该有一些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

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)

在这里,我们实现了两个函数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

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