Предотвратите отображение всех данных с помощью 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)

Сообщается о проблемах

Вернуться на верх