Как получить идентификатор модели в запросе Graphene Django Relay?

Как получить собственный идентификатор модели, который хранится в базе данных (например, идентификатор модели django), когда мы выполняем запрос Relay? Основная проблема в том, что Relay определяет свой собственный идентификатор, поэтому я не уверен, как мы можем правильно с этим справиться.

Например,

query {
  allFuelTypes (codeMatch: "g") {
    edges {
      node {
        id,
        code,
        label
      }
    }
  }
}

напечатает

{
  "data": {
    "allFuelTypes": {
      "edges": [
        {
          "node": {
            "id": "RnVlbFR5cGVOb2RlOjM=",
            "code": "g",
            "label": "Gas"
          }
        }
      ]
    }
  }
}

Где id - это идентификатор графенового реле, но я бы хотел увидеть идентификатор модели.

Единственный возможный способ, который я вижу, - это просто создать некоторый псевдоним в схеме графена для поля идентификатора модели и вручную получить этот идентификатор из модели Django. Но, может быть, существует более динамичный способ добиться того же результата?

Спасибо за любую помощь!

P.S. реализация запроса не важна. Это просто фиктивная демонстрация


person Velidan    schedule 03.02.2020    source источник


Ответы (3)


Это сработало для меня!

Определим простую модель:

class Account(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        ordering = ['id']

Теперь давайте определим соответствующий ему узел реле:

class AccountNode(DjangoObjectType):
    # just add this line
    id = graphene.ID(source='pk', required=True)

    class Meta:
        model = Account
        interfaces = (relay.Node, )

Прикрепите к себе запрос:

class Query(ObjectType):
    all_accounts = DjangoFilterConnectionField(AccountNode)

Сделайте свой запрос:

введите описание изображения здесь

person Juan-Kabbali    schedule 07.07.2020

Вы можете определить настраиваемое поле для pk, вот пример с user.

from django.contrib.auth import get_user_model
import graphene
from graphene_django.types import DjangoObjectType
from graphene_django.filter.fields import DjangoFilterConnectionField


class UserNode(DjangoObjectType):
    class Meta:
        model = get_user_model()
        interfaces = (graphene.relay.Node,)

    pk = graphene.Int()

    def resolve_pk(self, info):
        return self.pk

class UserQuery(graphene.ObjectType):
    user = graphene.relay.Node.Field(UserNode)
    users = DjangoFilterConnectionField(UserNode)

class Query(UserQuery, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query)

Затем вы можете запросить, например:

query {
  users{
    edges {
      node {
        pk
      }
    }
  }
}

Вы можете проверить другие примеры person pedrobern    schedule 03.02.2020

comment
Привет @pedrobern. Спасибо за ваш ответ. Я упомянул это решение в своем сообщении, но, возможно, существует какой-то элегантный способ получить идентификатор модели без псевдонима этого идентификатора и вручную разрешить его? - person Velidan; 03.02.2020

Его можно легко решить с помощью настраиваемого узла. Нравится -

class CustomNode(graphene.Node):
"""
    For fetching object id instead of Node id
"""

class Meta:
    name = 'Node'

@staticmethod
def to_global_id(type, id):
    return id

Теперь вам просто нужно импортировать его в свои интерфейсы узлов, такие как -

class UserNode(DjangoObjectType):
class Meta:
    model = get_user_model()
    interfaces = (CustomNode,)

Надеюсь, это послужит вашей цели.

person Ameya Marathe    schedule 02.05.2020