我想在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库仅适用于保护过滤器的用例?如果不是,有人可以请我提供一个例子,因为文档并没有意识到我是愚蠢的。
谢谢
答案 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