TD
Когда ты в джанге пишешь
unique=True
- миграция в базе создаёт unique constraint, который проверяет, очевидно, на полное совпадение - что-то типа UNIQUE (nickname)
Но ты вместо этого можешь создать свой constraint с кастомной проверкой:
UNIQUE (LOWER(nickname))
Но джанга инструментов для такого, насколько я знаю, не предоставляет, поэтому это придётся делать сырым sql-ем - в миграциях или отдельным скриптом.
(Я писал, основываясь на том, что позволяет постгрес делать, для других субд терминология и синтаксис могут отличаться)