Поиск не возвращает результаты в Django-rest-framework

Недавно я создавал серверную часть веб-приложения с помощью Django-rest-framework.

Я пытаюсь создать функцию поиска, в которой пользователь будет вводить имя местоположения, и будут отображаться все результаты, содержащие это имя.

Я использую icontains и Q. Мой тестовый поиск выглядит следующим образом:

class test_search(APIView):
    def post(self, request, *args, **kwargs):
        serializer_class =  customer_location
        title = json.loads(request.body).get('title')
        queryset = Customers.objects.filter(Q(title__icontains=title))
        data = serializers.serialize('json', queryset)
        return HttpResponse(data, content_type='application/json')

Я могу видеть страницу, которая просит меня ввести имя местоположения, но когда я ввожу имя и нажимаю POST, ничего не происходит. Я хочу отобразить значения, присутствующие в модели Customer, сериализаторе customer_location, которые соответствуют имени местоположения.

Я использую icontains, так как хочу вернуть все значения, которые его содержат.

Что я делаю не так? Как отобразить совпадающие результаты?

Когда я попробую это -

class test_search(APIView):
    def get(self, request, *args, **kwargs):
        serializer_class = customer_location
        title = request.query_params.get('title')
        queryset = Customers.objects.filter(Q(title__icontains=title))
        data = serializers.serialize('json', queryset)
        return Response(data, content_type='application/json')

Я получаю эту ошибку -

ValueError at /test_search/
Cannot use None as a query value
Request Method: GET
Request URL:    http://127.0.0.1:8000/test_search/
Django Version: 2.2.3
Exception Type: ValueError
Exception Value:    
Cannot use None as a query value
Exception Location: /usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py in build_lookup, line 1121
Python Executable:  /usr/local/opt/python/bin/python3.7

Когда я проверяю Postman, он отображает результаты. Почему он не отображает результат конечной точки / URL-адреса API?


person Seeker90    schedule 14.09.2019    source источник
comment
Предоставленный фрагмент кажется неполным. Вы не возвращаете ответ из метода post и не вызываете super. Класс сериализатора кажется неиспользуемым. Пожалуйста, предоставьте полный пример.   -  person stasiekz    schedule 14.09.2019
comment
Я отредактировал код. Я очень новичок в джанго. Я могу просмотреть результат в почтальоне, но конечная точка API не возвращает тот же результат.   -  person Seeker90    schedule 14.09.2019
comment
Объект Q здесь не нужен, его можно опустить. Тем не менее, serializer_class не инициализирован. Попробуйте вернуть обычный ответ из DRF без приведения данных к ул.   -  person stasiekz    schedule 14.09.2019
comment
Я удалил кастинг Q и str. Я все еще сталкиваюсь с той же проблемой.   -  person Seeker90    schedule 14.09.2019
comment
Что вы имеете в виду, когда не видите результат в конечной точке API, но можете видеть результат в Postman? Пожалуйста, обновите свой код, чтобы он стал рабочим фрагментом.   -  person stasiekz    schedule 14.09.2019
comment
когда я использую конечную точку API в почтальоне и пытаюсь отправить имя местоположения, я получаю список ответов. Но в браузере, когда я ввожу конечную точку и публикую название местоположения, ничего не отображается. Он просто показывает, что метод get не разрешен.   -  person Seeker90    schedule 14.09.2019
comment
Это связано с тем, что доступ к URL-адресу вашей конечной точки из браузера делает запрос GET, который не реализован. Вы должны реализовать метод get для таких операций, как фильтрация вашей базы данных и получение результатов. POST не предназначен для фильтрации.   -  person stasiekz    schedule 14.09.2019
comment
Я использую сообщение, потому что имя местоположения должно быть введено пользователем. Могу ли я использовать пост и попасть в тот же класс? Как я могу это сделать ? я нуб в джанго   -  person Seeker90    schedule 14.09.2019
comment
Смотрите ответ.   -  person stasiekz    schedule 14.09.2019


Ответы (1)


Это связано с тем, что доступ к URL-адресу вашей конечной точки из браузера делает запрос GET, который не реализован. Вы должны реализовать метод get для таких операций, как фильтрация вашей базы данных и получение результатов. POST не предназначен для фильтрации.

Реализуйте метод get вместо post так, как вы реализовали post.

Ваш пользователь может ввести значение местоположения, даже если это GET, потому что HTML-формы могут быть отправлены как POST или GET. GET является методом отправки по умолчанию, если вы не установили его в элементе формы html.

person stasiekz    schedule 14.09.2019
comment
как я могу реализовать то же самое, что и post в моем случае? Я не знаю, как это сделать. - person Seeker90; 14.09.2019
comment
Я получаю эту ошибку, когда заменяю post на get - JSONDecodeError в /test_search/ Ожидаемое значение: строка 1, столбец 1 (char 0) Метод запроса: GET URL-адрес запроса: 127.0.0.1:8000/test_search Версия Django: 2.2.3 Тип исключения: JSONDecodeError Значение исключения: Ожидаемое значение: строка 1 столбец 1 (char 0) Расположение исключения: /usr/ local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py в raw_decode, строка 355. Исполняемый файл Python: /usr/local/opt/python/bin/ питон3.7 - person Seeker90; 14.09.2019
comment
Доступ к заголовку выглядит следующим образом: title = request.query_params.get('title') - person stasiekz; 14.09.2019
comment
Я получаю эту ошибку сейчас: ValueError в /test_search/ Невозможно использовать None в качестве значения запроса. Метод запроса: URL-адрес запроса GET: 127.0.0.1:8000/test_search Версия Django: 2.2.3 Тип исключения: ValueError Значение исключения: Невозможно использовать None в качестве значения запроса Местоположение исключения: /usr/local/lib/python3.7/site-packages/django /db/models/sql/query.py в build_lookup, строка 1121. Исполняемый файл Python: /usr/local/opt/python/bin/python3.7 - person Seeker90; 14.09.2019
comment
Похоже, вы не передаете параметр заголовка: введите 127.0.0.1:8000/test_search?title=your_title и измените логику, чтобы он возвращал все результаты, если параметр не передан: ``` if title: queryset = Customers.objects.filter(title__icontains=title) else: queryset = Клиенты.объекты.все() ``` - person stasiekz; 14.09.2019
comment
Я не хочу возвращать все, если нет совпадения. Я хочу, чтобы пользователи видели пустую страницу с возможностью передать имя местоположения, а затем должны отображаться совпадающие результаты. Я попытался ввести 127.0.0.1:8000/test_search?title=your_title. Он возвращает какие-то странные данные html :( - person Seeker90; 15.09.2019