Django中不区分大小写的唯一模型字段?

发布于 2021-01-29 18:30:45

我的用户名基本上是唯一的(不区分大小写),但是按用户提供的显示时大小写很重要。

我有以下要求:

  • 字段与CharField兼容
  • 字段是唯一的,但不区分大小写
  • 字段需要可忽略大小写进行搜索(避免使用iexact,容易忘记)
  • 字段存储的情况不变
  • 最好在数据库级别执行
  • 最好避免存储额外的字段

在Django中有可能吗?

我想出的唯一解决方案是“以某种方式”覆盖模型管理器,使用额外的字段或在搜索中始终使用“ iexact”。

我使用的是Django 1.3和PostgreSQL 8.4.2。

关注者
0
被浏览
181
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    将原始 大小写混合的字符串存储在纯文本列中 。使用数据类型 text
    varchar不使用长度修饰符而不是varchar(n)。它们本质上是相同的,但是必须使用varchar(n)设置任意长度限制,如果以后要更改,可能会很麻烦。在手册中Peter Eisentraut @
    serverfault.SE的相关答案中
    了解更多有关此内容的信息。

    创建一个 功能独特的指数lower(string)。这是这里的重点:

    CREATE UNIQUE INDEX my_idx ON mytbl(lower(name));
    

    如果尝试INSERT使用小写形式的混合大小写名称,则会出现唯一的密钥冲突错误。
    对于快速相等搜索,请使用如下查询:

    SELECT * FROM mytbl WHERE lower(name) = 'foo' --'foo' is lower case, of course.
    

    使用您在索引中使用的相同表达式(以便查询计划程序识别兼容性),这将非常快。


    顺便说一句:您可能想升级到PostgreSQL的最新版本。自从8.4.2起,已经进行了许多重要的修复。更多有关官方Postgres版本控制网站的信息



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看