Мой ответ применим только к Postgresql, но здесь может быть одно решение:
У Django с postgresql есть CICharField
поле модели в django.contrib.postgres.fields
.Это также поддерживает индексирование строки без учета регистра.Строки будут по-прежнему храниться в правильном регистре, но операции сравнения будут нечувствительными к регистру.
from django.contrib.postgres.field import CICharField
class Page(Model):
book = ForeignKey(Book, on_delete=CASCADE)
page = IntegerField()
start = CICharField(max_length=350, db_index=True)
end = CICharField(max_length=350, db_index=True)
Это должно примерно решить вашу проблему, вы сможете использовать gte
и lte
фильтры и сравнение будет без учета регистра.Он должен прекрасно обрабатывать юникод в зависимости от настроек вашей базы данных.
t1 = "breast"
t2 = "beast"
t3 = "block"
page1 = Page.objects.create(start='beaver', end='brother')
page2 = Page.objects.create(start='boy', end='brother')
Page.objects.filter(start__lte=t1, end__gte=t1) # <QuerySet [<Page: Page start=beaver, end=brother>, <Page: Page start=boy, end=brother>]>
Page.objects.filter(start__lte=t2, end__gte=t2) # <QuerySet []>
Page.objects.filter(start__lte=t3, end__gte=t3) # <QuerySet [<Page: Page start=beaver, end=brother>]>
t4 = "Ù" # Between Ø and Ú
t5 = "Ü" # Not between Ø and Ú
page3 = Page.objects.create(start='Ø', end='Ú')
Page.objects.filter(start__lte=t4, end__gte=t4) # <QuerySet [<Page: Page start=Ø, end=Ú>]>
Page.objects.filter(start__lte=t5, end__gte=t5) # <QuerySet []>
Это изменение приведет к миграции, которая устанавливает CITextExtension()
в базу данных и изменяет столбцы.Вам может нужно разделить этот файл миграции на две миграции, где первая установит CITextExtension
, а вторая изменит ваши существующие столбцы.