下面是一个非常简单的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']}不幸的是,这仍然不会导致错误,所以我原来的问题仍然存在。
发布于 2016-02-08 19:09:58
如果服务器不识别查询字符串参数,则典型的行为是忽略该参数。没有标准或rfc指定如何处理意外的查询字符串参数。但是很多网站和web框架都会自由地接受请求,而不会执行任何验证来拒绝包含多余或拼写错误的查询参数的请求。
换句话说,这并不是Django Rest框架所特有的。
这个特性使得ajax缓存崩溃成为可能。jQuery将向每个ajax请求添加一个名为_的参数,该参数具有随机值,以确保该请求具有唯一的url,并且不会被缓存在任何地方。如果服务器在接收意外查询参数时返回错误,则此操作将无法工作。
https://stackoverflow.com/questions/35276384
复制相似问题