【问题标题】:graphene-django - How to filter?graphene-django - 如何过滤?
【发布时间】:2017-03-15 21:16:38
【问题描述】:

我使用 graphen-django 构建 GraphQL API。 我已成功创建此 API,但无法传递参数以过滤我的响应。

这是我的 models.py

from django.db import models

class Application(models.Model):
    name = models.CharField("nom", unique=True, max_length=255)
    sonarQube_URL = models.CharField("Url SonarQube", max_length=255, blank=True, null=True)

    def __unicode__(self):
    return self.name

这是我的 schema.py: 进口石墨烯 从 graphene_django 导入 DjangoObjectType 从模型导入应用程序

class Applications(DjangoObjectType):
    class Meta:
        model = Application

class Query(graphene.ObjectType):
    applications = graphene.List(Applications)

    @graphene.resolve_only_args
    def resolve_applications(self):
        return Application.objects.all()


schema = graphene.Schema(query=Query)

我的urls.py

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^admin/', admin.site.urls),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^api-token-auth/', authviews.obtain_auth_token),
    url(r'^graphql', GraphQLView.as_view(graphiql=True)),
]

如您所见,我还有一个 REST API。

我的 settings.py 包含以下内容:

GRAPHENE = {
    'SCHEMA': 'tibco.schema.schema'
}

我关注这个:https://github.com/graphql-python/graphene-django

当我发送这个请求时:

{
  applications {
    name
  }
}

我收到了这样的回复:

{
  "data": {
    "applications": [
      {
        "name": "foo"
      },
      {
        "name": "bar"
      }
    ]
   }
}

所以,它的工作原理!

但是当我尝试传递这样的参数时:

{
  applications(name: "foo") {
    name
    id
  }
}

我有这样的回应:

{
  "errors": [
   {
      "message": "Unknown argument \"name\" on field \"applications\" of type \"Query\".",
      "locations": [
        {
          "column": 16,
          "line": 2
        }
      ]
    }
  ]
}

我错过了什么?还是我做错了什么?

【问题讨论】:

    标签: python django graphql graphene-python


    【解决方案1】:

    感谢:https://docs.graphene-python.org/projects/django/en/latest/

    这是我的答案。我已经编辑了我的 schema.py

    import graphene
    from graphene import relay, AbstractType, ObjectType
    from graphene_django import DjangoObjectType
    from graphene_django.filter import DjangoFilterConnectionField
    from models import Application
    
    class ApplicationNode(DjangoObjectType):
        class Meta:
            model = Application
            filter_fields = ['name', 'sonarQube_URL']
            interfaces = (relay.Node, )
    
    class Query(ObjectType):
        application = relay.Node.Field(ApplicationNode)
        all_applications = DjangoFilterConnectionField(ApplicationNode)
    
    schema = graphene.Schema(query=Query)
    

    然后,它缺少一个包:django-filter (https://github.com/carltongibson/django-filter/tree/master)。 DjangoFilterConnectionField 使用 Django-filter。

    现在我可以这样做了:

    query {
      allApplications(name: "Foo") {
        edges {
          node {
            name
          }
        }
      }
    }
    

    响应将是:

    {
      "data": {
        "allApplications": {
          "edges": [
            {
              "node": {
                "name": "Foo"
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      如果您是我的情况并且不想使用 Relay,您还可以使用 Django orm 过滤直接在解析器中处理过滤。此处示例:Filter graphql query in django

      【讨论】:

      • 在其他通用的声音DjangoListField 中有一个耦合可以重播,这太疯狂了
      【解决方案3】:

      对 Adrien Answer 的一点补充。如果您想在过滤时执行不同的操作,例如包含和完全匹配,请编辑您的 schema.py

      class ApplicationNode(DjangoObjectType):
          class Meta:
              model = Application
              # Provide more complex lookup types
              filter_fields = {
                  'name': ['exact', 'icontains', 'istartswith']
              }
              interfaces = (relay.Node, )
      

      你可以这样写查询

        query {
        allApplications(name_Icontains: "test") {
          edges {
            node {
              id,
              name
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-09
        • 2018-08-25
        • 2023-03-11
        • 2018-04-13
        • 2019-06-10
        • 2018-02-24
        • 2019-02-26
        • 1970-01-01
        • 2021-10-13
        相关资源
        最近更新 更多