【问题标题】:Search doesn't return results in Django-rest-framework搜索不会在 Django-rest-framework 中返回结果
【发布时间】:2020-01-16 01:03:20
【问题描述】:

我最近正在使用 Django-rest-framework 构建一个 Web 应用后端。

我正在尝试构建一个搜索功能,用户将在其中输入位置名称并显示包含该名称的所有结果。

我正在使用 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 时,它会显示结果。为什么不显示 api endpoint/url 的结果?

【问题讨论】:

  • 您提供的 sn-p 似乎不完整。您既不会从 post 方法返回响应,也不会调用 super。序列化程序类似乎未使用。请提供完整的例子。
  • 我编辑了代码。我对 Django 很陌生。我可以在邮递员中查看结果,但 api 端点没有返回相同的结果。
  • 这里不需要Q对象,可以省略。仍然没有初始化 serializer_class。尝试从 DRF 返回常规响应而不将数据转换为 str。
  • 我删除了 Q 和 str 转换。我仍然面临同样的问题。
  • 在 api 端点中看不到结果但在 Postman 中看到结果到底是什么意思?请更新您的代码,使其成为有效的 sn-p。

标签: django django-rest-framework django-filter


【解决方案1】:

这是因为从浏览器访问您的端点 url 会产生未实现的 GET 请求。您应该为过滤数据库和获取结果等操作实现 get 方法。 POST 不是用来过滤的。

用你实现 post 的方式实现 get 方法而不是 post。

即使是 GET,您的用户也可以输入位置值,因为 HTML 表单可以作为 POST 或 GET 提交。如果您未在 html 表单元素中设置 GET,则它是默认提交方法。

【讨论】:

  • 在我的案例中,如何实现 get 来做与 post 相同的事情?我不知道该怎么做。
  • 当我用 get 替换 post 时出现此错误 - /test_search/ 处的 JSONDecodeError 预期值:第 1 行第 1 列(字符 0) 请求方法:GET 请求 URL:127.0.0.1:8000/test_search Django 版本:2.2。 3 异常类型:JSONDecodeError 异常值:预期值:第 1 行第 1 列(字符 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/python3.7
  • 访问标题如下:title = request.query_params.get('title')
  • 我现在得到这个错误 - ValueError at /test_search/ 不能使用 None 作为查询值 请求方法:GET 请求 URL: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 in build_lookup,第 1121 行 Python 可执行文件:/usr/local/opt/ python/bin/python3.7
  • 看起来您没有传递标题参数:输入127.0.0.1:8000/test_search?title=your_title 并更改逻辑,以便在未传递参数时返回所有结果:``` if title: queryset = Customers.objects .filter(title__icontains=title) else: queryset = Customers.objects.all() ```
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2022-01-03
相关资源
最近更新 更多