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

xkrw2x1b  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(121)

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

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

将打印

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

其中id是石墨烯中继器ID,但我想看到型号ID。
我看到的唯一一种可能的方法就是在graphene Schema中为Model ID字段创建一些别名,然后从Django Model手动获取这个ID。但也许存在一些更有活力的方法来实现同样的结果?
感谢您的任何帮助!
P.S.查询的实现并不重要。这只是个模拟演示

rseugnpd

rseugnpd1#

这对我很有效!
让我们定义一个简单的模型:

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)

提出您的请求:

nkkqxpd9

nkkqxpd92#

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

你可以在这里查看其他例子。

t1rydlwq

t1rydlwq3#

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

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

希望这对你有用。

相关问题