你能在Sqlite3(使用Django)中实现不区分大小写的“唯一”约束吗?

时间:2008-11-09 23:20:13

标签: python django sqlite django-models

所以,假设我使用的是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做,让它按照我想要的方式运行。 : - )

2 个答案:

答案 0 :(得分:9)

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

在mytable上创建独特的索引uidxName(myfield COLLATE NOCASE)

如果您需要对非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文档显示为here

答案 1 :(得分:3)

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