djangofilterbackend查询参数和未填充的查询参数选项

时间:2017-06-25 02:17:23

标签: python django filtering django-filter

我想在django中创建viewset,它将获取带有查询参数的url并对查询参数进行过滤。我在文档方面遇到的最大问题是它不能证明这些问题。以django rest framework docs http://www.django-rest-framework.org/api-guide/filtering/

为例
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('category', 'in_stock')

将使用以下网址:

http://example.com/api/products?category=clothing&in_stock=True

但是,如果我有一个没有设置类别选项的网址,例如。这段代码会破坏吗?或者它是否足够聪明,知道什么时候不填充查询参数过滤器并忽略它?

如果不是,那么我想我必须创建一个这样的过滤器:

ass PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer

def get_queryset(self):
    """
    Optionally restricts the returned purchases to a given user,
    by filtering against a `username` query parameter in the URL.
    """
    queryset = Purchase.objects.all()
    username = self.request.query_params.get('username', None)
    if username is not None:
        queryset = queryset.filter(purchaser__username=username)
    return queryset

哪个好,但是这是否意味着djangofilterbackend库仅适用于保护过滤器的用例?如果不是,有人可以请我提供一个例子,因为文档并没有意识到我是愚蠢的。

谢谢

1 个答案:

答案 0 :(得分:1)

Django过滤器是一个非常强大的库,使得过滤和搜索非常容易。您提供的示例来自django filter docs,它清楚地解释了视图集中过滤器的用法。

正如问题所指出的那样,过滤器在

上运行清晰

http://example.com/api/products?category=clothing&in_stock=True

此网址提供了使用category- clothing和stock-True过滤的产品列表。

但是,如果您不提供filter_fields中指定的查询参数

http://example.com/api/products/

然后,这会给出产品列表而不应用任何过滤,因此,如果不需要应用过滤,则无需在URL中提供查询参数。

所以网址:

http://example.com/api/products?category=&in_stock=

and 

http://example.com/api/products/

两者都给出相同的结果。

当只应用一个过滤器时,它也有效。 所以网址

http://example.com/api/products?category=clothing

and 

http://example.com/api/products?category=clothing&in_stock=

都会给出相同的结果

最后,可以构建自定义查询集,在自定义查询集之前应用过滤器参数,如

def my_new_queryset(self):
    queryset = self.filter_queryset(self.get_queryset())
    // customize queryset 
    ...

或者,只需覆盖filter_queryset方法进行通用过滤。 http://www.django-rest-framework.org/api-guide/filtering/#custom-generic-filtering