Skip to main content
 首页 » 编程设计

python之使用 django-filter,为什么未指定或无效的查找类型会返回所有结果

2025年05月04日44lvdongjie

这是一个非常简单的 Django Rest Framework/django-filter 代码示例:

class MyModelFilter(django_filters.FilterSet): 
    class Meta: 
        model = MyModel 
        fields = {'my_str_field': ['exact']} 
 
class MyModelList(generics.ListAPIView): 
    queryset = MyModel.objects.all() 
    filter_class = MyModelFilter 
 
    def get(self, request, format=None): 
        items = self.filter_queryset(self.queryset)  # apply filters 
        serializer = MyModelSerializer(items, many=True) 
        return Response(serializer.data) 

当我进行此 API 调用时,exact 查找类型按预期工作,返回匹配的对象:

/myobjects/?my_str_field=somevalue 

如果我使用 icontains,如您所见,我没有将其指定为受支持的查找类型之一,则会返回所有 对象,就好像过滤器不是应用:

/myobjects/?my_str_field__icontains=this_can_be_anything 

此外,我什至可以使用无效的查找类型,并且不会有任何错误,再次返回所有对象:

 /myobjects/?my_str_field__this_can_be_anything=this_can_be_anything 

这显然会产生误导,因为无法访问后端代码的前端开发人员可以愉快地认为一切都很好并使用返回的对象。我希望,如果不是错误,后两种情况至少会有一个空结果集。我做错了什么?

更新:看来我应该像这样使用严格设置:

from django_filters.filterset import STRICTNESS 
class MyModelFilter(django_filters.FilterSet): 
    # throw an exception on errors instead of returning empty results 
    strict = STRICTNESS.RAISE_VALIDATION_ERROR 
    class Meta: 
        model = MyModel 
        fields = {'my_str_field': ['exact']} 

不幸的是,这仍然没有导致错误,所以我原来的问题仍然存在。

请您参考如下方法:

如果服务器无法识别查询字符串参数,典型的行为是忽略该参数。没有指定如何处理意外查询字符串参数的标准或 rfc。但是很多网站和 Web 框架会自由地接受请求,并且不会执行任何验证来拒绝包含多余或拼写错误的查询参数的请求。

换句话说,这不是 Django Rest Framework 特有的。

此功能使 ajax 缓存清除成为可能。 jQuery 将向每个 ajax 请求添加一个名为 _ 的参数,该参数具有随机值,以确保该请求具有唯一的 url 并且不会缓存在任何地方。如果服务器在接收到意外的查询参数时返回错误,这将不起作用。