阻止Django-filter显示所有数据



我目前正在使用Django-filter开发一个搜索系统。例如,如果在以下条件下搜索,将返回所有显示。

数据
[
{
"id": 1,
"city": "aaa",
},
{
"id": 2,
"city": "bbb",
},
{
"id": 3,
"city": "ccc",
}
]

views.py

class CitySearchView(APIView):
def get(self, request):
if not request.GET:
raise Http404()
queryset = City.objects.all()
filterset = FilterCity(request.query_params, queryset=queryset)
serializer = CitySerializer(instance=filterset.qs, many=True)
return Response(serializer.data)

filter.py

class FilterCity(filters.FilterSet):
city = filters.CharFilter(lookup_expr='icontains')
class Meta:
model = City
fields = []

请求URL没有值

http://127.0.0.1:8000/api/search/?city=

反应

[
{
"id": 1,
"city": "aaa",
},
{
"id": 2,
"city": "bbb",
},
{
"id": 3,
"city": "ccc",
}
]

我希望返回字符串"未找到"。或空数组[]。在这种情况下,我应该如何实现它?

谢谢。

Django-filter严格过滤

from django-filter>=2.0.0,严格的过滤行为已经改变。当filter没有任何结果时,返回queryset.all()。如果你想保持"严格"的过滤风格,你可以尝试以下操作:

  • 直接覆盖django_filters.FilterSet
  • 使用自定义方法过滤

重写FilterSet

class FilterSet(django_filters.FilterSet):
# override
@property
def qs(self):
if not hasattr(self, '_qs'):
qs = self.queryset.all()
if self.is_bound:
if self.form.is_valid():
qs = self.filter_queryset(qs)
else:
qs = self.queryset.none()
self._qs = qs
return self._qs

定义自定义方法filter_city

class FilterCity(filters.FilterSet):
city = filters.CharFilter(method='filter_city')
def filter_city(self, queryset, name, value):
# if no city, return empty queryset
if value in [None, '']:
return queryset.none()
else:
return queryset.filter(city=city)

问题报道

  • https://github.com/carltongibson/django-filter/pull/108
  • https://github.com/carltongibson/django-filter/issues/1139

你可以直接做

city = request.GET.get("city")
# Depending upon type of request
# city = request.POST.get("city")
City.objects.filter(city = city)

最新更新