首页 文章

Graphene / Django(GraphQL):如何使用查询参数来排除与特定过滤器匹配的节点?

提问于
浏览
3

我在Django / Graphene后端设置中有一些视频项目 . 每个视频项都链接到一个所有者 . 在React应用程序中,我想通过GraphQL一方面查询当前用户拥有的所有视频,另一方面查询当前用户不拥有的所有视频 .

我可以在客户端运行以下GraphQl查询和过滤器:

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
        }
      }
    }
  }
}

我会查询 ownerName = currentUserNameexclude = True/False 但我无法在我的后端检索我的 exclude 参数 . 这是我在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 arg传递给它 . (我不认为我正在正确使用resolver) . 任何有关此事的帮助将不胜感激!

1 回答

  • 3

    切换到graphene-django 1.0,我已经能够通过以下查询定义做我想要的事情:

    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

相关问题