You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目中Sqlite3下icontains大小写不敏感搜索失效问题

解决SQLite下Django __icontains 查询大小写敏感问题

问题根源

SQLite 默认的文本排序规则是区分大小写的,Django 的 name__icontains 依赖数据库原生的不区分大小写匹配支持,因此在 SQLite 环境下会出现语法合法但实际不生效的情况。

解决方案

1. 模型字段指定不区分大小写排序规则(推荐)

直接在 Product 模型的 name 字段上添加 db_collation="NOCASE",让该字段的所有查询默认不区分大小写:

class Product(models.Model):
    name = models.CharField(max_length=255, db_collation="NOCASE")
    # 其他字段定义...

修改后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

之后原代码中的 name__icontains=search_query 就能正常生效。

2. 查询时手动转换大小写(无需改模型)

用 Django 的 Lower 函数配合注解实现匹配:

from django.db.models.functions import Lower

def get_queryset(self):
    search_query = self.request.GET.get('q')
    if search_query:
        return Product.objects.annotate(
            lower_name=Lower('name')
        ).filter(lower_name__icontains=search_query.lower())
    else:
        return Product.objects.none()

3. 使用 extra 方法直接写SQL语句

通过原生SQL的 LOWER 函数实现不区分大小写匹配:

def get_queryset(self):
    search_query = self.request.GET.get('q')
    if search_query:
        return Product.objects.extra(
            where=['LOWER(name) LIKE %s'],
            params=['%' + search_query.lower() + '%']
        )
    else:
        return Product.objects.none()

内容的提问来源于stack exchange,提问作者Copy-Ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:49:57