7

我想知道是否可以获得对象的“原始ID”作为查询的结果。每当我向服务器发出请求时,它都会返回节点“全局标识符”,例如U29saWNpdGFjYW9UeXBlOjEzNTkxOA==.

查询与此类似:

{
  allPatients(active: true) {
    edges {
      cursor
      node {
        id
        state
        name
      }
    }
  }

回报是:

{
  "data": {
      "edges": [
        {
          "cursor": "YXJyYXljb25uZWN0aW9uOjA=",
          "node": {
            "id": "U29saWNpdGFjYW9UeXBlOjEzNTkxOA==",
            "state": "ARI",
            "name": "Brad"
          }
        }
      ]
  }
}

如何在数据库级别获取对象的“原始”ID(例如“112”)而不是该节点唯一标识符?

ps.:我在服务器端使用graphene-python和Relay。

4

4 回答 4

6

覆盖 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,)
于 2018-11-19T21:00:24.253 回答
3

第一个选项,删除 relay.Node 作为你的 objectNode 声明的接口。

第二种选择,使用自定义 resolve_id 函数返回 id 原始值。

例子

class objectNode(djangoObjectType):

    .... Meta ....

    id = graphene.Int(source="id")

    def resolve_id("commons args ...."):
        return self.id

希望能帮助到你

于 2018-06-29T13:11:25.600 回答
2

有了这个,您可以检索数据库中的真实ID:

def get_real_id(node_id: str):
    _, product_id_real = relay.Node.from_global_id(global_id=node_id)
    return product_id_real
于 2020-07-10T19:57:23.000 回答
1

为了扩展最佳答案以及使用 SQLAlchemy 对象类型的人,这对我有用:

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. 否则你会得到和断言错误。

于 2020-03-09T21:06:55.310 回答