django 中不区分大小写的搜索/过滤器

问题描述 投票:0回答:1

在我的 django 项目的搜索类 我尝试从数据库获取产品查询,但它区分大小写 无论我尝试什么,我仍然无法增强我的搜索查询 也许不是这样解决问题,我会找到一种可能的方法来解决它 但我使用 Sqlite3 的最大的一个问题是方法
(name__icontains=search_query)
无效,我的意思是有效但不起作用

搜索类的一部分:

    def get_queryset(self):
        search_query = self.request.GET.get('q')
        print(f"start q {search_query}")
        print(Product.objects.filter(name__icontains=search_query))
        print(repr(search_query),"----------")
        if search_query:
            # Filter products where label contains the search query (case-insensitive)
            return Product.objects.filter(name__icontains=search_query)
        else:
            return Product.objects.none()
python-3.x django sqlite django-views
1个回答
0
投票

__icontains 过滤器应该适用于不区分大小写的包含测试。可能是一些设置问题可能会影响其行为。

您可以使用自定义 SQL 强制执行不区分大小写的搜索。 Django 的 ORM 允许您执行原始 SQL 查询,这在 ORM 功能不足的情况下会很有帮助。

from django.db import connection

def get_queryset(self):
    search_query = self.request.GET.get('q')
    if search_query:
        with connection.cursor() as cursor:
            cursor.execute("SELECT * FROM your_product_table WHERE name LIKE %s COLLATE NOCASE", [f"%{search_query}%"])
            result_list = cursor.fetchall()
        # Convert the result_list to QuerySet if necessary
    else:
        return Product.objects.none()

尝试自定义代码,看看它是否有效,您也可以尝试提高日志记录级别以查看正在生成和执行的实际 SQL 查询。

这可能会让您更深入地了解幕后发生的事情。 Django 的日志记录可以配置为在控制台中显示所有 SQL 查询。

import logging

logger = logging.getLogger('django.db.backends')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())

一旦我们有了这种洞察力,我们就可以进一步应用修复。

© www.soinside.com 2019 - 2024. All rights reserved.