代码之家  ›  专栏  ›  技术社区  ›  Nevenoe

石墨烯django-如何过滤?

  •  21
  • Nevenoe  · 技术社区  · 8 年前

    我使用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)
    

    我的 url.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)),
    ]
    

    如您所见,我还有一个RESTAPI。

    我的 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
            }
          ]
        }
      ]
    }
    

    3 回复  |  直到 8 年前
        1
  •  21
  •   Nevenoe    5 年前

    由于以下原因,我找到了解决方案: 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过滤器( https://github.com/carltongibson/django-filter/tree/master ). Django过滤器由DjangoFilterConnectionField使用。

    现在我可以这样做了:

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

    并且响应将是:

    {
      "data": {
        "allApplications": {
          "edges": [
            {
              "node": {
                "name": "Foo"
              }
            }
          ]
        }
      }
    }
    
        2
  •  5
  •   elachere    5 年前

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

        3
  •  3
  •   monofal    4 年前

    除了阿德里安的回答。如果要在筛选时执行不同的操作,如包含和精确匹配,请编辑 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
          }
        }
      }
    }