如何使用Django的_filter()和exclude()方法实现精确和模糊条件查询?

2026-04-30 20:160阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1233个文字,预计阅读时间需要5分钟。

如何使用Django的_filter()和exclude()方法实现精确和模糊条件查询?

在默认情况下,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),性能随数据量增长明显下降。

阅读全文
标签:django

本文共计1233个文字,预计阅读时间需要5分钟。

如何使用Django的_filter()和exclude()方法实现精确和模糊条件查询?

在默认情况下,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),性能随数据量增长明显下降。

阅读全文
标签:django