【问题标题】:Cannot get last n elements from GraphQL with graphene_django无法使用 graphene_django 从 GraphQL 获取最后 n 个元素
【发布时间】: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 项目中的代码吗?如何解决?

【问题讨论】:

    标签: django django-rest-framework graphql graphene-python


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 2017-11-10
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 2010-10-11
          • 2023-01-02
          相关资源
          最近更新 更多