【问题标题】:How to get the Model ID in the Graphene Django Relay query?如何在 Graphene Django Relay 查询中获取模型 ID?
【发布时间】:2020-05-19 06:03:19
【问题描述】:

当我们执行 Relay 查询时,如何接收存储在数据库中的本机模型 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。

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

感谢您的帮助!

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

【问题讨论】:

    标签: django graphql relay graphene-django


    【解决方案1】:

    这对我有用!

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

    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)
    

    提出您的要求:

    【讨论】:

      【解决方案2】:

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

      您可以查看其他示例here

      【讨论】:

      • 嗨@pedroben。谢谢您的回答。我在我的帖子中提到了这个解决方案,但是,也许存在一些优雅的方式来接收模型 ID,而不用别名这个 ID 并手动解析它?
      【解决方案3】:

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

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

      希望这能达到你的目的。

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 2019-12-20
        • 2020-05-20
        • 2019-05-02
        • 2019-10-31
        • 1970-01-01
        • 2016-01-02
        • 2019-08-28
        • 2023-03-30
        相关资源
        最近更新 更多