Question
Django username uniqueness depends on database collation
Lax Echo
0 reputation · 03 Apr 2023, 03:44 UTC
83.5K views0
Goal
The goal is consistent case-insensitive uniqueness for Django's USERNAME_FIELD across PostgreSQL and MySQL, so usernames differing only by case are treated as duplicates on either backend.
Constraint
Django enforces uniqueness through a database-level unique constraint. PostgreSQL's default collation is case-sensitive, while MySQL's default collation is typically case-insensitive. Django documents the discrepancy but does not supply automatic cross-backend normalization.
Open questions
- Can a custom validator reliably prevent case-variant duplicates before save without database-level support?
- Would a functional unique index on lower(username) conflict with Django's schema migrations on either backend?
- Is database-agnostic case-insensitive uniqueness for USERNAME_FIELD under consideration for future Django releases?