如何在 Graphene Django Relay 查询中获取模型 ID?

Vel*_*dan 6 django relay graphql graphene-django

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

例如。

query {
  allFuelTypes (codeMatch: "g") {
    edges {
      node {
        id,
        code,
        label
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将打印

{
  "data": {
    "allFuelTypes": {
      "edges": [
        {
          "node": {
            "id": "RnVlbFR5cGVOb2RlOjM=",
            "code": "g",
            "label": "Gas"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助!

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

Jua*_*ali 9

这对我有用!

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

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

    class Meta:
        ordering = ['id']
Run Code Online (Sandbox Code Playgroud)

现在让我们定义其对应的中继节点:

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

    class Meta:
        model = Account
        interfaces = (relay.Node, )
Run Code Online (Sandbox Code Playgroud)

将其附加到您身上 查询:

class Query(ObjectType):
    all_accounts = DjangoFilterConnectionField(AccountNode)
Run Code Online (Sandbox Code Playgroud)

提出您的要求:

在此处输入图片说明


ped*_*ern 6

您可以为 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)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样查询:

query {
  users{
    edges {
      node {
        pk
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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