Пользовательское поле Django - автоматически добавлять COLLATE в запрос - PullRequest
3 голосов
/ 01 июля 2010

Я пытаюсь создать настраиваемое поле, которое бы автоматически добавляло информацию COLLATE в часть WHERE SQL-запроса:

class IgnoreDiacriticsField(models.TextField):

    def get_prep_lookup(self, lookup_type, value):
        if lookup_type == 'exact':
            return ' "' + self.get_prep_value(value) + '" COLLATE utf8_general_ci'

когда я выполняю запрос, подобный этому:

result = ModelClass.objects.filter(field='value')

тогда ничего не найдено, даже если запрос (print result.query) действителен и соответствует нескольким строкам. Я что-то не так делаю?

Причина, по которой я добавляю информацию о сопоставлении, заключается в том, что я хочу выполнять запросы к этим полям и игнорировать любые диакритические знаки.

1 Ответ

0 голосов
/ 24 декабря 2011

Вы случайно используете MySQL 1.2.1p2?Из документации Django

Если вы используете MySQLdb 1.2.1p2, стандартный класс CharField в Django будет возвращать строки юникода даже с сортировкой utf8_bin.Однако поля TextField будут возвращены как экземпляр array.array (из стандартного модуля массива Python).Django не может ничего с этим поделать, поскольку, опять же, информация, необходимая для выполнения необходимых преобразований, недоступна, когда данные считываются из базы данных.Эта проблема была исправлена ​​в MySQLdb 1.2.2, поэтому, если вы хотите использовать TextField с сортировкой utf8_bin, обновите до версии 1.2.2 и затем работайте со строками байтов (что не должно быть слишком сложно), как описано выше, является рекомендуемым решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...