当前位置: 首页 > 面试题库 >

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

高明辉
2023-03-14
问题内容

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

我有以下要求:

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

在Django中可能吗?

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

我使用的是Django 1.3和PostgreSQL 8.4.2。


问题答案:

将原始大小写混合的字符串存储在纯文本列中。使用数据类型textvarchar不使用长度修饰符而不是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.

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



 类似资料:
  • 如何在Django中查询/筛选并忽略查询字符串的大小写? 我得到了一些类似于并且类似于忽略:

  • 问题内容: 如何在Django中查询/过滤并忽略查询字符串的大小写? 我有类似的事情,并且喜欢忽略以下情况: 问题答案: 我这样解决了: 甚至可以使用它来进行子字符串搜索:

  • 问题内容: 我希望我的字典不区分大小写。 我有以下示例代码: 输出=练习更改颜色 我想要另一个字符串,(以大写字母开头)也给出相同的输出。 我相信有一种使用转换为小写字母的通用方法, 但是我不确定如何将其最好地集成到我的现有代码中。(如果无论如何这将是一种合理,简单的方法)。 问题答案: 如果我对您的理解正确,并且希望以一种不区分大小写的方式键入字典的键,则一种方法是将dict子类化并重载sett

  • 问题内容: 我知道,我可以从DJango ORM运行不区分大小写的搜索。喜欢, 而且,我可以将它们作为 是否存在不区分大小写的直接获取方式?正如我想要一个序列 如果没有,那么建议一种最佳方法。提前致谢。 问题答案: 这个答案已经过时,请使用django 1.8检查以下解决方案-> 我发现使用.extra的解决方案

  • 问题内容: 我正在尝试用单词列表填充SQL表。该表本身非常简单: 我遇到的问题是这样的:当我执行以下操作时,会背对背插入 第二个插入因约束冲突而失败(“键’WORD’的条目’seth’重复”)。 我如何获得区分大小写的约束? 问题答案: 看起来mysql 默认是不区分大小写的: 您可能需要使用区分大小写的排序规则创建列(例如utf8_bin):