6

当我们执行 Relay 查询时,如何接收存储在数据库中的本机模型 ID(例如 django 模型 ID)?中继定义它自己的 ID 的主要问题,所以我不确定我们如何正确处理它。

例如。

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

将打印

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

其中id是石墨烯中继 ID,但我想查看模型 ID。

我看到的唯一一种可能的方法是在石墨烯模式中为模型 ID 字段创建一些别名,并从 Django 模型中手动获取此 ID。但也许存在一些更动态的方式来实现相同的结果?

谢谢你的帮助!

PS查询的实现并不重要。这只是一个虚拟演示

4

3 回答 3

11

这对我有用!

让我们定义一个简单的模型:

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)

提出您的要求:

在此处输入图像描述

于 2020-07-07T09:53:24.880 回答
5

您可以为 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
      }
    }
  }
}

您可以在此处查看其他示例。

于 2020-02-03T14:13:24.280 回答
1

它可以使用自定义节点轻松解决。像这样 -

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,)

希望这符合您的目的。

于 2020-05-02T03:09:51.963 回答