2016-09-28 2 views
3

Django/Grapheneバックエンドの設定でいくつかのビデオ項目があります。各動画アイテムは1人の所有者にリンクされています。 Reactアプリケーションでは、現在のユーザーが所有するすべてのビデオと、現在のユーザーが所有していないすべてのビデオをGraphQLで照会したいと考えています。Graphene/Django(GraphQL):特定のフィルタに一致するノードを除外するためにクエリ引数を使用する方法は?

私は、次のGraphQlクエリを実行し、クライアント側でフィルタリングすることができます:私はむしろ、フィルタパラメータは、直接私のバックエンドに関連するデータを尋ねると2つのクエリを持っているでしょう

query AllScenes { 
    allScenes { 
    edges { 
     node { 
     id, 
     name, 
     owner { 
      name 
     } 
     } 
    } 
    } 
} 

。ような何か:

query AllScenes($ownerName : String!, $exclude: Boolean!) { 
    allScenes(owner__name: $ownerName, exclude: $exclude) { 
    edges { 
     node { 
     id, 
     name, 
     owner { 
      name 
     } 
     } 
    } 
    } 
} 

は、私はまだ、私はちょうど私のバックエンド側の私のexclude引数を取得することはできませんownerName = currentUserNameexclude = True/Falseで照会します。ここで私は私のschema.pyファイルにしようとしているコードです:

from project.scene_manager.models import Scene
 
from graphene import ObjectType, relay, Int, String, Field, Boolean, Float
 
from graphene.contrib.django.filter import DjangoFilterConnectionField 
from graphene.contrib.django.types import DjangoNode
 
from django_filters import FilterSet, CharFilter 



 

class SceneNode(DjangoNode): 

 class Meta:
 
     model = Scene 





class SceneFilter(FilterSet):
 
    owner__name = CharFilter(lookup_type='exact', exclude=exclude) 

 
    class Meta:
 
     model = Scene
 
     fields = ['owner__name']

 

class Query(ObjectType):

 
    scene = relay.NodeField(SceneNode)
 
    all_scenes = DjangoFilterConnectionField(SceneNode, filterset_class=SceneFilter, exclude=Boolean())

 

    def resolve_exclude(self, args, info):
 
     exclude = args.get('exclude')
 
     return exclude


 

    class Meta:
 
     abstract = True 

マイカスタムSceneFilter使用されているが、私はそれにexclude引数を渡す方法がわかりません。 (私はresolverを適切に使用しているとは思わない)。その問題に関するどんな助けも非常に高く評価されるでしょう!グラフェンジャンゴ1.0への切り替え

答えて

3

は、私は次のクエリ定義に望んでいた何をすることができました:

class Query(AbstractType): 

    selected_scenes = DjangoFilterConnectionField(SceneNode, exclude=Boolean()) 

    def resolve_selected_scenes(self, args, context, info): 
     owner__name = args.get('owner__name') 
     exclude = args.get('exclude') 
     if exclude: 
      selected_scenes = Scene.objects.exclude(owner__name=owner__name) 
     else: 
      selected_scenes = Scene.objects.filter(owner__name=owner__name) 
     return selected_scenes 

BossGrandはGitHubの

an other solutionを提案しました
関連する問題