我基本上有一个用户名是唯一的(不区分大小写),但在显示用户提供的时,大小写很重要。
我有以下要求:
- 字段与 CharField 兼容
- 字段是唯一的,但不区分大小写
- 字段需要忽略大小写可搜索(避免使用 iexact,容易忘记)
- 字段存储时大小写完好
- 最好在数据库级别执行
- 最好避免存储额外的字段
这在 Django 中可能吗?
我想出的唯一解决方案是“以某种方式”覆盖模型管理器、使用额外字段或始终在搜索中使用“iexact”。
我在 Django 1.3 和 PostgreSQL 8.4.2 上。
原文由 noobzie 发布,翻译遵循 CC BY-SA 4.0 许可协议
将原始 混合大小写字符串存储在纯文本列 中。使用不带长度修饰符的数据类型
text
或varchar
而不是varchar(n)
。它们本质上是相同的,但是对于 varchar(n) ,您必须设置任意长度限制,如果您以后想更改,这可能会很痛苦。 在手册 或 Peter Eisentraut @serverfault.SE 的相关回答 中阅读更多相关信息。在
lower(string)
上创建 功能唯一索引。这是这里的重点:如果您尝试
INSERT
一个已经存在的小写混合名称,您会收到唯一的密钥违规错误。对于快速相等搜索,使用这样的查询:
使用与索引中相同的表达式(以便查询规划器识别兼容性),这将非常快。
顺便说一句:您可能想要升级到更新版本的 PostgreSQL。 自 8.4.2 以来有很多重要的修复。更多关于 官方 Postgres 版本控制站点。