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
}
]
}
]
}
私が逃したものは何ですか?それとも私は何か間違ったことをしますか?
おかげで解決策を見つけました: 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"
}
}
]
}
}
}
私の場合、Relayを使用したくない場合は、Django ormフィルタリングを使用して、リゾルバーで直接フィルタリングを処理することもできます。例: Filter graphql query in Django