11👍
✅
Yes this can easily be done by adding a unique index to the table with the following command:
CREATE UNIQUE INDEX uidxName ON mytable (myfield COLLATE NOCASE)
If you need case insensitivity for nonASCII letters, you will need to register your own COLLATION with commands similar to the following:
The following example shows a custom collation that sorts “the wrong way”:
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()
Additional python documentation for sqlite3 shown here
👤Noah
4👍
Perhaps you can create and use a custom model field; it would be a subclass of CharField but providing a db_type method returning “text collate nocase”
2👍
For anyone in 2021, with the help of Django 4.0 UniqueConstraint expressions you could add a Meta class to your model like this:
class Meta:
constraints = [
models.UniqueConstraint(
Lower('<field name>'),
name='<constraint name>'
),
]
- Django ORM and hitting DB
- Google App Engine and Cloud SQL: Lost connection to MySQL server at 'reading initial communication packet'
- Python – pyodbc call stored procedure with parameter name
- How to access user names and profiles with django-allauth
- Correct setup of django redis celery and celery beats
Source:stackexchange.com