如何使用Django的_filter()和exclude()方法实现精确和模糊条件查询?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1233个文字,预计阅读时间需要5分钟。
在默认情况下,Django 使用 SQL 的等值比较(`=`)进行字符串字段的过滤。这意味着 `filter(name='alice')` 会被解释为 `__exact` 过滤器,而不是模糊匹配。因此,它不会进行任何形式的模糊搜索,只匹配完全相等的值。
许多人误以为不添加后缀可能模糊就是模糊匹配,但实际上并不是这样。Django 对字符串字段默认进行精确匹配,不考虑大小写,这取决于数据库的 collation(校对规则)。例如:
所以如果你在 PostgreSQL 上查 filter(name='Alice') 查不到 alice,不是 Django 问题,是数据库行为。要强制大小写不敏感,得显式用 __iexact。
-
__exact:显式声明等值匹配,语义清晰,但多数时候可省略 -
__iexact:跨数据库统一实现大小写不敏感,比改数据库 collation 更可控 - 别依赖“不加后缀=模糊”,这是常见误解;没后缀就是
__exact
模糊匹配必须用 __contains、__icontains 还是其他?
__contains 是最常用的子串匹配,生成 SQL 的 LIKE '%value%';__icontains 是它的大小写不敏感版。但要注意:它们无法利用 B-tree 索引加速前导通配(%xxx),性能随数据量增长明显下降。
本文共计1233个文字,预计阅读时间需要5分钟。
在默认情况下,Django 使用 SQL 的等值比较(`=`)进行字符串字段的过滤。这意味着 `filter(name='alice')` 会被解释为 `__exact` 过滤器,而不是模糊匹配。因此,它不会进行任何形式的模糊搜索,只匹配完全相等的值。
许多人误以为不添加后缀可能模糊就是模糊匹配,但实际上并不是这样。Django 对字符串字段默认进行精确匹配,不考虑大小写,这取决于数据库的 collation(校对规则)。例如:
所以如果你在 PostgreSQL 上查 filter(name='Alice') 查不到 alice,不是 Django 问题,是数据库行为。要强制大小写不敏感,得显式用 __iexact。
-
__exact:显式声明等值匹配,语义清晰,但多数时候可省略 -
__iexact:跨数据库统一实现大小写不敏感,比改数据库 collation 更可控 - 别依赖“不加后缀=模糊”,这是常见误解;没后缀就是
__exact
模糊匹配必须用 __contains、__icontains 还是其他?
__contains 是最常用的子串匹配,生成 SQL 的 LIKE '%value%';__icontains 是它的大小写不敏感版。但要注意:它们无法利用 B-tree 索引加速前导通配(%xxx),性能随数据量增长明显下降。

