Почему __icontains ищет с учётом регистра, и как это исправить?

В модели ищется поле name по подстроке: profileModel.objects.filter(name__icontains = search). Например при вводе ку, будут доступны результаты: кукла, макушка и т.д., но кУкла, МАКУШКА не добавятся как подходящие варианты.

Объясните пожалуйста почему, и как это исправить!


Ответы (2 шт):

Автор решения: Andrey Maslov

похоже используется неправильный collation при использовании mysql. Тут обсуждался вопрос о том как его сменить. https://stackoverflow.com/questions/6050014/how-do-you-change-the-collation-type-for-a-mysql-column.

Для sqlite поиск без учета регистра происходит только для латинского алфавита. Один из вариантов решения - перейти на другую БД(postgres, mysql). Если по каким-то причинам нужно остаться именно на sqllite, придется использовать костыли. например доработать свою profileModel

ProfileModel = class(models.Model):
    name = models.CharField(max_length=255, verbose_name="описание")
    name_lower = models.CharField(max_length=255, verbose_name="описание", editable=False)

    def save(*args, **kwargs):
        self.name_lower = self.name.lower() if self.name else None
        return super().save(*args, **kwargs)

и там где нужен поиск без учета регистра - переводить строку поиска в нижний регистр и искать по новому полю ProfileModel.objects.filter(name_lower__contains = search.lower())

→ Ссылка
Автор решения: Artem

Учу сей час Django и столкнулся с такой же проблемой, так как учебный материал на английском. Я нашел простое решение, заменить icontains на iregex.

Моя функция выглядела так:

def search(request):
    q = request.GET['q']
    data = Product.objects.filter(title__icontains=q).order_by('-id')
    return render(request, 'search.html', {'data': data})

Я сделал так:

def search(request):
    q = request.GET['q']
    data = Product.objects.filter(title__iregex=q).order_by('-id')
    return render(request, 'search.html', {'data': data})

и поиск заработал на кириллице без учета регистра. Пишу тут ответ, так нигде не нашел четкого решения "Поиска" в кириллице, и потратил на это полтора дня серфа.

→ Ссылка