首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-filter,为什么未指定或无效的查找类型返回所有结果?

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

Stack Overflow用户
提问于 2016-02-08 18:11:56
回答 1查看 778关注 0票数 3

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

代码语言:javascript
复制
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查找类型按预期工作,返回匹配的对象:

代码语言:javascript
复制
/myobjects/?my_str_field=somevalue

如果我使用icontains,正如您所看到的,我没有将其指定为受支持的查找类型之一,则返回所有对象,就好像没有应用筛选器一样:

代码语言:javascript
复制
/myobjects/?my_str_field__icontains=this_can_be_anything

此外,我甚至可以使用无效的查找类型,并且不会出现错误,并且返回所有对象:

代码语言:javascript
复制
 /myobjects/?my_str_field__this_can_be_anything=this_can_be_anything

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

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

代码语言:javascript
复制
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']}

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-08 19:09:58

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

换句话说,这并不是Django Rest框架所特有的。

这个特性使得ajax缓存崩溃成为可能。jQuery将向每个ajax请求添加一个名为_的参数,该参数具有随机值,以确保该请求具有唯一的url,并且不会被缓存在任何地方。如果服务器在接收意外查询参数时返回错误,则此操作将无法工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35276384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档