Получить идентификатор объекта в GraphQL

Я хотел бы знать, можно ли получить «исходный идентификатор» объекта в результате запроса. Всякий раз, когда я делаю запрос на сервер, он возвращает «глобальный идентификатор» узла, что-то вроде U29saWNpdGFjYW9UeXBlOjEzNTkxOA== .

Запрос похож на этот:

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

и возврат:

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

Как я могу получить «исходный» идентификатор объекта на уровне базы данных (например, «112») вместо уникального идентификатора этого узла?

PS: Я использую graphene-python и Relay на стороне сервера.


person almanegra    schedule 29.09.2017    source источник


Ответы (4)


У меня сработало переопределение метода to_global_id по умолчанию в объекте Node:

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,)
person alexxmagpie    schedule 19.11.2018

Первый вариант: удалите relay.Node как интерфейс вашего объявления objectNode.

Второй вариант: используйте пользовательскую функцию resolve_id для возврата исходного значения идентификатора.

Пример

class objectNode(djangoObjectType):

    .... Meta ....

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

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

Надеюсь, поможет

person Charles DOUKOURE    schedule 29.06.2018
comment
Я получил следующую ошибку: Node.id expects type "ID!" but xxx.id provides type "Int". - person Alfa Bravo; 15.10.2018

Чтобы расширить верхний ответ и для тех, кто использует типы объектов 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 в качестве интерфейса, вам нужно будет использовать уникальное имя в вашем CustomNode. В противном случае вы получите ошибку утверждения.

person bashful_ben    schedule 09.03.2020
comment
Наконец, кто-то, кто отвечает на вопрос, не говоря об определении отдельного атрибута. Это работает, спасибо! - person emptywalls; 16.06.2021

При этом вы можете получить настоящий идентификатор в базе данных:

def get_real_id(node_id: str):
    _, product_id_real = relay.Node.from_global_id(global_id=node_id)
    return product_id_real
person Floder    schedule 10.07.2020