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"),
            )
        )

Поэтому мне приходится делать это ВЕЗДЕ в приложении, когда пользователю нужно искать по его электронной почте. Но приложение большое.

Есть ли какое-нибудь другое решение для этого?

Вернуться на верх