代码之家  ›  专栏  ›  技术社区  ›  aalberti333

用GraphQL调用django石墨烯中的过滤器

  •  0
  • aalberti333  · 技术社区  · 6 年前

    自定义筛选器,没有关于如何 呼叫 他们在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 回复  |  直到 6 年前
        1
  •  2
  •   greenLED    6 年前

    检查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 . 筛选器声明为 过滤器集 覆盖 过滤器集 元类。