我已经实现了graphql,并且正在迁移以进行中继。我已经为每个表创建了一个uuid,并将其命名为“ id”。在我的应用程序中,我发现this github thread谈到可能会更改规格,但感觉就像一个兔子洞。
是否可以通过中继使用自己的自定义ID?
答案 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中。我在实现石墨烯和中继时阅读了它们,但是一次要学习的东西太多了,很容易阅读自定义节点部分,并且以后不记得需要做一个自定义节点解决方案了。