web-dev-qa-db-ja.com

グラフェン-Django-フィルタリングする方法は?

GraphQLAPIの構築にはgraphen-Djangoを使用しています。この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
        }
      ]
    }
  ]
}

私が逃したものは何ですか?それとも私は何か間違ったことをしますか?

14
Neau Adrien

おかげで解決策を見つけました: 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 )。 Django-filterはDjangoFilterConnectionFieldによって使用されます。

今、私はこれを行うことができます:

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

応答は次のようになります。

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

私の場合、Relayを使用したくない場合は、Django ormフィルタリングを使用して、リゾルバーで直接フィルタリングを処理することもできます。例: Filter graphql query in Django

1
elachere