重写
定义自定义方法
我目前正在使用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)