我想知道是否有可能获得对象的“原始id”作为查询的结果。每当我向服务器发出请求时,它都会返回节点“全局标识符”,类似U29saWNpdGFjYW9UeXBlOjEzNTkxOA==
。
查询与此类似:
{
allPatients(active: true) {
edges {
cursor
node {
id
state
name
}
}
}
并且返回:
{
"data": {
"edges": [
{
"cursor": "YXJyYXljb25uZWN0aW9uOjA=",
"node": {
"id": "U29saWNpdGFjYW9UeXBlOjEzNTkxOA==",
"state": "ARI",
"name": "Brad"
}
}
]
}
}
如何在数据库级别(例如'112')获取对象的“原始”id而不是该节点唯一标识符?
ps。:我在服务器端使用graphene-python和Relay。
答案 0 :(得分:4)
在Node对象中覆盖默认的to_global_id方法对我来说是可行的:
class CustomNode(graphene.Node):
class Meta:
name = 'Node'
@staticmethod
def to_global_id(type, id):
return id
class ExampleType(DjangoObjectType):
class Meta:
model = Example
interfaces = (CustomNode,)
答案 1 :(得分:1)
第一个选项,删除relay.Node作为objectNode声明的接口。
第二个选项,使用自定义resolve_id功能返回id原始值。
示例
class objectNode(djangoObjectType):
.... Meta ....
id = graphene.Int(source="id")
def resolve_id("commons args ...."):
return self.id
希望有帮助
答案 2 :(得分:1)
要扩展最重要的答案以及那些使用SQLAlchemy Object Types的对象,这对我有用:
class CustomNode(graphene.Node):
class Meta:
name = 'myNode'
@staticmethod
def to_global_id(type, id):
return id
class ExampleType(SQLAlchemyObjectType):
class Meta:
model = Example
interfaces = (CustomNode, )
如果您有使用Relay.Node作为接口的其他ObjectType,则需要在CustomNode
下使用唯一名称。否则,您将得到和断言错误。
答案 3 :(得分:1)
使用此方法,您可以检索数据库中的真实ID:
def get_real_id(node_id: str):
_, product_id_real = relay.Node.from_global_id(global_id=node_id)
return product_id_real