使用GraphQL在Django-Graphene中调用过滤器

时间:2018-09-22 18:41:01

标签: django graphql graphene-python

我一直在关注Django中Graphene-Python的文档,并且刚刚进入自定义过滤器部分。虽然提供了有关如何编写自定义过滤器的教程,但是在GraphiQL中没有有关如何调用的参考。如果我有以下示例代码:

class AnimalNode(DjangoObjectType):
    class Meta:
        # Assume you have an Animal model defined with the following fields
        model = Animal
        filter_fields = ['name', 'genus', 'is_domesticated']
        interfaces = (relay.Node, )


class AnimalFilter(django_filters.FilterSet):
    # Do case-insensitive lookups on 'name'
    name = django_filters.CharFilter(lookup_expr=['iexact'])

    class Meta:
        model = Animal
        fields = ['name', 'genus', 'is_domesticated']

    @property  # make your own filter like this
    def qs(self):
        return super(EquityFilter, self).qs.filter(id=self.request.user)


class Query(ObjectType):
    animal = relay.Node.Field(AnimalNode)
    # We specify our custom AnimalFilter using the filterset_class param
    all_animals = DjangoFilterConnectionField(AnimalNode,
                                              filterset_class=AnimalFilter)

我的问题是,我需要在GraphiQL中键入什么才能使用此过滤器?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

检查GraphiQL中的架构。它应该显示类似于此查询的根查询:

allAnimals(
  before:String,
  after:String,
  firts:Int,
  last:Int,
  name:String,
  genus:String,
  isDomesticated:Boolean
):AnimalNodeConnection

这三个过滤条件作为查询参数公开,因此您可以将它们用于这样的查询:

query filteredAnimals{
  allAnimals(
    name:"Big Foot",
    genus:"Unknown",
    isDomesticated:false
  ) {
    edges {
      node {
        name
        genus
        isDomesticated
      }
    }
  }
}

这将使您与属为“未知”的未驯化动物“大脚”(“大脚”,“大脚”等)建立联系。

注意:在FilterSet元类上声明的过滤器是根据它们执行的过滤类型来命名的,例如name_Icontainsname_Iexact。声明为FilterSet字段的过滤器(在您的情况下为名称过滤器)保持其名称不变,并且扩展或 OVERRIDE 过滤器在FilterSet Meta类中声明。