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

时间:2016-02-08 18:11:56

标签: python django django-rest-framework django-filter

这是一个非常简单的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,如您所见,我没有将其指定为受支持的查找类型之一,则会返回所有对象,就好像未应用过滤器一样:< / p>

/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']}

不幸的是,这仍然不会导致错误,因此我的原始问题仍然存在。

1 个答案:

答案 0 :(得分:1)

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

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

此功能可以使ajax缓存破坏成为可能。 jQuery将为每个单独的ajax请求添加一个带有随机值的_参数,以确保该请求具有唯一的URL并且不会缓存在任何地方。如果服务器在收到意外的查询参数时返回错误,则无效。