【问题标题】:Calling filters in django-graphene with GraphQL使用 GraphQL 在 django-graphene 中调用过滤器
【发布时间】:2019-02-26 19:26:29
【问题描述】:

我一直在关注 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 中输入什么内容才能使用此过滤器?非常感谢任何帮助。

【问题讨论】:

  • “使用此过滤器”是什么意思?使用上面的代码,您的查询已经在使用AnimalFilter。你指的是如何在 GraphiQL 中指定用户?
  • 感谢@kirbuchi 的回复,我想我在这里误解了一些基本的东西。使用 GraphiQL,当我们使用 filter_fields = {'name': ['exact', 'icontains', 'istartswith']} 等格式应用之前的过滤器时,我会在 GraphiQL 控制台中输入 query {allAnimals(name_Icontains: "lion") { edges { node { id, name }}}} 以使用过滤器。我的问题是,我需要在 GraphiQL 控制台中输入什么才能使用我在最初问题中发布的新创建的自定义过滤器?另外,既然你提到了它,我将如何在 GraphiQL 中指定用户?

标签: django graphql graphene-python


【解决方案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_Icontains、name_Iexact。声明为 FilterSet 字段的过滤器(在您的情况下为名称过滤器)保持其名称不变,并扩展或 OVERRIDE 在 FilterSet 元类中声明的过滤器。

【讨论】:

  • 感谢您的澄清,感谢您的帮助!
猜你喜欢
  • 2019-06-10
  • 2018-02-24
  • 2018-08-25
  • 2017-08-29
  • 2021-11-09
  • 2019-04-20
  • 2017-03-15
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多