13

因此,假设我使用的是 Python 2.5 的内置默认 sqlite3,并且我有一个 Django 模型类,其代码如下:

class SomeEntity(models.Model):
    some_field = models.CharField(max_length=50, db_index=True, unique=True)

我已经设置了管理界面,一切似乎都工作正常,除了我可以创建两条 SomeEntity 记录,一条带有 some_field='some value' 和一条带有 some_field='Some Value' 因为 some_field 上的唯一约束似乎是区分大小写。

在检查唯一性时,是否有某种方法可以强制 sqlite在敏感比较中执行大小写?

我似乎在 Django 的文档中找不到这个选项,我想知道是否有什么我可以直接对 sqlite 做的事情,让它按照我想要的方式运行。:-)

4

3 回答 3

10

是的,这可以通过使用以下命令向表中添加唯一索引来轻松完成:

在 mytable (myfield COLLATE NOCASE) 上创建唯一索引 uidxName

如果您需要对非 ASCII 字母不区分大小写,则需要使用类似于以下的命令注册自己的 COLLATION:

以下示例显示了一个按“错误方式”排序的自定义排序规则:

import sqlite3

def collate_reverse(string1, string2):
    return -cmp(string1, string2)

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.cursor()
cur.execute("create table test(x)")
cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
cur.execute("select x from test order by x collate reverse")
for row in cur:
    print row
con.close()

此处显示的 sqlite3 的其他 python 文档

于 2009-01-22T22:18:21.477 回答
3

也许您可以创建和使用自定义模型字段;它将是 CharField 的子类,但提供返回“文本整理 nocase”的db_type方法

于 2008-11-10T00:00:26.960 回答
1

对于 2021 年的任何人,在Django 4.0 UniqueConstraint 表达式的帮助下,您可以将 Meta 类添加到您的模型中,如下所示:

class Meta:
    constraints = [
        models.UniqueConstraint(
            Lower('<field name>'),
            name='<constraint name>'
        ),
    ]
于 2021-12-12T10:41:14.567 回答