无法使用 graphene_django 从 GraphQL 获取最后 n 个元素

Posted

技术标签:

【中文标题】无法使用 graphene_django 从 GraphQL 获取最后 n 个元素【英文标题】:Cannot get last n elements from GraphQL with graphene_django 【发布时间】:2019-07-14 22:36:00 【问题描述】:

我试图在现有的 Django REST 框架中实现 GraphQL。我用 graphene-django==2.2.0

已成功实施。但不能在请求查询中使用“last”关键字。我正在添加架构代码。

import graphene
from graphene_django.types import DjangoObjectType
from flowers.models import Flower


class FlowerType(DjangoObjectType):
    class Meta:
        model = Flower


class Query(graphene.ObjectType):
    flowers = graphene.List(FlowerType)

    def resolve_flowers(self, info, **kwargs):
        return Flower.objects.all()

查询


    flowers (last: 2)
        id
    

结果


  "errors": [
    
      "locations": [
        
          "column": 12,
          "line": 2
        
      ],
      "message": "Unknown argument \"last\" on field \"flowers\" of type \"Query\"."
    
  ]

我必须修改 Django 项目中的代码吗?如何解决?

【问题讨论】:

【参考方案1】:

在您的 GraphQL 架构中。您需要具体了解接受最后一个参数并返回查​​询的查询。请指定花的返回类型(根据您的情况)

class Query(graphene.ObjectType):
  flowers = graphene.List(FlowerType, last=graphene.Int())

  def resolve_flowers(self, args, context, info):
    query = FlowerType.get_query(context)
    return query.get(args.get('last'))

Or

query($last: Int!): ReturnType

你可以把你的查询改成那个

query($flowerId: 2) 
    flowers (last: $flowerId)
        id
    

【讨论】:

【参考方案2】:

或者干脆使用 Relay,它已经提供了这个过滤器等等。

class FlowerType(DjangoObjectType):
    class Meta:
        model = Flower
        interfaces = (graphene.relay.Node,)

class FlowerConnection(graphene.relay.Connection):
    class Meta:
        node = FlowerType

class Query(graphene.ObjectType):
    flowers = graphene.relay.ConnectionField(FlowerConnection)

    def resolve_flowers(self, info, **kwargs):
        return Flower.objects.all()

【讨论】:

【参考方案3】:

获取最后 N 个帖子

lastNPosts = graphene.List(PostType, N=graphene.Int())

def resolve_lastNPosts(self, info, N):
    try:
        return Post.objects.order_by('-id')[:N]
    except Post.DoesNotExist:
        return None

【讨论】:

以上是关于无法使用 graphene_django 从 GraphQL 获取最后 n 个元素的主要内容,如果未能解决你的问题,请参考以下文章

“未知类型\”CreateAccountInput\”。尝试变异/创建新对象时使用graphene_django

在 graphene/graphene_django 中扩展查询参数

ModuleNotFoundError:没有名为“graphene_django”的模块

graphene_django 源码走读

如何隐藏/排除graphene_django中请求实体的某些外键字段?

无法根据语言环境“el-GR”解析十进制数[关闭]