Как получить Django для выполнения запроса без учета регистра к моим MySql 5,7 дБ? - PullRequest
1 голос
/ 26 марта 2020

Я использую Django 2.0 и Python 3.7. У меня есть эта модель и менеджер для попытки найти мою модель по имени, без учета регистра. Резервная база данных: MySql 5.7.

class CoopManager(models.Manager):
    ...

    # Look up coops by a partial name (case insensitive)
    def find_by_name(self, partial_name):
        queryset = Coop.objects.filter(name__icontains=partial_name, enabled=True)
        print(queryset.query)
        return queryset


class Coop(models.Model):
    objects = CoopManager()
    name = models.CharField(max_length=250, null=False)
    type = models.ForeignKey(CoopType, on_delete=None)
    address = AddressField(on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True, null=False)
    phone = PhoneNumberField(null=True)
    email = models.EmailField(null=True)
    web_site = models.TextField()

К сожалению, когда запрос действительно создается, он, похоже, Django ничего не делает для учета нечувствительности к регистру. Это пример запроса, который приводит ...

SELECT `maps_coop`.`id`, `maps_coop`.`name`, `maps_coop`.`type_id`, `maps_coop`.`address_id`, `maps_coop`.`enabled`, `maps_coop`.`phone`, `maps_coop`.`email`, `maps_coop`.`web_site` FROM `maps_coop` WHERE (`maps_coop`.`name` LIKE %res% AND `maps_coop`.`enabled` = True)

Какие изменения мне нужно сделать, чтобы Django выполнял запрос без учета регистра для моей базы данных MySql?

Редактировать: Вот вывод MySql для "show create table ..."

| maps_coop | CREATE TABLE `maps_coop` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) COLLATE utf8_bin NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `phone` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `email` varchar(254) COLLATE utf8_bin DEFAULT NULL,
  `web_site` longtext COLLATE utf8_bin NOT NULL,
  `address_id` int(11) DEFAULT NULL,
  `type_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `maps_coop_address_id_f90898f3` (`address_id`),
  KEY `maps_coop_type_id_982652ce_fk_maps_cooptype_id` (`type_id`),
  CONSTRAINT `maps_coop_address_id_f90898f3_fk_address_address_id` FOREIGN KEY (`address_id`) REFERENCES `address_address` (`id`),
  CONSTRAINT `maps_coop_type_id_982652ce_fk_maps_cooptype_id` FOREIGN KEY (`type_id`) REFERENCES `maps_cooptype` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=933 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

1 Ответ

1 голос
/ 29 марта 2020

Необходимо изменить MySQL сопоставление базы данных / таблицы на utf8_unicode_ci или utf_unicode_ci; аббревиатура ci в конце расшифровывается как "c ase i nsensitive" .

Также проверьте это Q / A utf8_bin против utf_unicode_ci .

...