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
相关产品推荐
相关产品推荐

