Как получить идентификатор модели в запросе на ретранслятор Graphene Django? - PullRequest
0 голосов
/ 03 февраля 2020

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

Например.

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

напечатает

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

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

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
      }
    }
  }
}

Вы можете проверить другие примеры здесь .

0 голосов
/ 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,)

Надеюсь, это соответствует вашим целям.

...