Django миграция с CIEmailField на collation
Я обновил версию django до 4.2.8, после чего CIEmailField() устарел.
Я использовал это CIEmailField в поле электронной почты пользователя. Поэтому мне пришлось изменить его на:
email = models.EmailField(unique=True, db_collation="case_insensitive")
Итак, миграция выглядит следующим образом:
operations = [
CreateCollation(
"case_insensitive",
provider="icu",
locale="und-u-ks-level2",
deterministic=True,
),
migrations.AlterField(
model_name="user",
name="email",
field=models.EmailField(db_collation="case_insensitive", max_length=254),
),
]
Но до этого изменения, с помощью CIEmailField я бы .get() пользователя с таким email "test@test.com" или "TEST@test.com".
При использовании нечувствительной к регистру коляции я заставил ее работать только путем установки "deterministic=False". Но при этом LIKE в SQL не работает. Таким образом, каждый Viewset с "email" в "search_fields" не будет работать.
Чтобы заставить его работать, я нашел только это решение:
class UserAdmin(BaseUserAdmin):
search_fields = ("email_deterministic", ...)
...
def get_queryset(self, request: HttpRequest) -> QuerySet[User]:
return (
super()
.get_queryset(request)
.annotate(
email_deterministic=Collate("email", "und-x-icu"),
)
)
Поэтому мне приходится делать это ВЕЗДЕ в приложении, когда пользователю нужно искать по его электронной почте. Но приложение большое.
Есть ли какое-нибудь другое решение для этого?