Предотвратите отображение всех данных с помощью Django-filter
В настоящее время я разрабатываю систему поиска с использованием Django-filter. Например, при поиске по следующим условиям будут возвращены все отображения.
Data
[
{
"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",
}
]
Я надеюсь вернуть строку "Not Found" или пустой массив array[]. В таком случае, как я должен это реализовать?
Спасибо.
Вы можете просто сделать
City.objects.filter(query_param = request.query_param)
Django-filter STRICT filtering
начиная с django-filter>=2.0.0, поведение строгой фильтрации изменилось. когда фильтр не имеет никакого результата, возвращается 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)