Python djangofilterbackend查询参数和未填充的查询参数选项
我想在django中创建viewset,它将获取带有查询参数的url,并根据查询参数进行过滤。我对文档的最大问题是它不能证明它们是白痴。以django rest框架文档为例 将与以下url一起使用: 但是如果我有一个没有设置category选项的url呢。这个密码会被破解吗?或者知道何时未填充查询参数过滤器并忽略它是否足够聪明 如果不是,我会想象我必须创建一个如下的过滤器:Python djangofilterbackend查询参数和未填充的查询参数选项,python,django,filtering,django-filter,Python,Django,Filtering,Django Filter,我想在django中创建viewset,它将获取带有查询参数的url,并根据查询参数进行过滤。我对文档的最大问题是它不能证明它们是白痴。以django rest框架文档为例 将与以下url一起使用: 但是如果我有一个没有设置category选项的url呢。这个密码会被破解吗?或者知道何时未填充查询参数过滤器并忽略它是否足够聪明 如果不是,我会想象我必须创建一个如下的过滤器: ass PurchaseList(generics.ListAPIView): serializer_class = P
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库只适用于保证过滤器的用例?如果没有,请有人给我举个例子,因为医生们不知道我是多么愚蠢
谢谢Django filter是一个非常强大的库,它使过滤和搜索变得非常简单。您提供的示例来自,它清楚地解释了视图集中过滤器的用法 正如问题所指出的那样,过滤器可以清晰地工作 此url提供使用类别筛选的产品列表-服装和库存为True 但是如果您不提供在
filter\u字段中指定的查询参数
like
然后给出产品列表,而不应用任何过滤,因此,如果不需要应用过滤,则不需要在url中提供查询参数
因此,URL:
http://example.com/api/products?category=&in_stock=
and
http://example.com/api/products/
两者给出相同的结果。
当只应用一个过滤器时,它也起作用。
所以URL
两者给出相同的结果
最后,可以构建定制queryset,在定制queryset之前应用过滤器参数,如
def my_new_queryset(self):
queryset = self.filter_queryset(self.get_queryset())
// customize queryset
...
或者,只需重写filter\u queryset
方法即可进行一般筛选。
谢谢你,伙计,但是你的答案令人困惑。使用djangofilterbackend设置筛选器是否允许URL不存在查询参数或仅存在一个查询参数,即使有针对5的筛选器?我在中的意思是,我是否可以使用DjangoFilterBackend作为动态使用查询参数的djangobackend文档中所示的示例?正如不保证所有查询参数都存在一样?是的,它允许URL不存在查询参数。如示例所示,这没有什么区别。如果值存在,则查询参数将起作用,否则notok则可以安全地推断它也允许存在一些但并非所有的查询参数正确吗?
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
...