Изменение с unqiue=True на unique=False в django

У меня есть модель с CharField, для которой ранее значение «уникальный» было установлено как «Истина», но теперь оно изменено на «Ложь». Но когда я пытаюсь сохранить это поле с чем-то существующим, django все равно выдает ошибку IntegrityError.

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

База данных — MySQL.


person espenhogbakk    schedule 13.01.2010    source источник


Ответы (4)


Отбросьте уникальный индекс.

person Ignacio Vazquez-Abrams    schedule 13.01.2010
comment
Я предполагаю, что вы хотите удалить уникальный индекс в таблице MySQL? (просто во избежание путаницы для людей, плохо знакомых с Django, которые могут подумать, что индекс следует исключить из модели Django) - person Tom van Enckevort; 13.01.2010
comment
Хорошо, я попробовал это: «ALTER TABLE tblname DROP INDEX fieldname», но это не сработало. Все равно выдает ошибку целостности. - person espenhogbakk; 13.01.2010
comment
Вы уверены, что запрос, который вы отправили, выполняется правильно? Сначала вы должны проверить, как называются индексы в вашей таблице. Вы можете выполнить команду SHOW INDEX FROM mytable FROM mydb; против вашей базы данных, и он должен отображать индексы в этой таблице - затем вы можете удалить уникальный. - person fest; 14.01.2010
comment
Это сработало, я использовал неправильное имя, когда пытался удалить индекс, но после того, как я перечислил индексы и получил правильное имя, мне удалось решить эту проблему. Итак, после того, как вы измените на unique=False, сделайте это. ПОКАЗАТЬ ИНДЕКС ИЗ mytable ИЗ mydb; ALTER TABLE mytable DROP INDEX indexname; - person espenhogbakk; 14.01.2010
comment
Это частичное решение, но как насчет юнит-тестов на основе sqlite, которые не могут сбрасывать ограничения после создания таблицы? - person Kenny Ostrom; 26.04.2016
comment
... В первую очередь создайте таблицу правильно. Что, предположительно, сделают тесты, если модель верна. - person Ignacio Vazquez-Abrams; 26.04.2016

Я предлагаю использовать http://south.aeracode.org, это приложение для миграции БД для Django, которое позволяет вносить такие изменения, даже не касаясь оболочки/администратора MySQL. Таким образом, у вас есть воспроизводимые макросы для обновления любого компьютера до последней схемы БД.

И использовать его так же просто, как они написали здесь: http://south.aeracode.org/wiki/ConvertingAnApp

person Tomasz Zieliński    schedule 02.02.2010

Убедились ли вы, что повторно синхронизировали свою базу данных в django с помощью команды «python manage.py syncdb» в командной строке перед повторным запуском веб-приложения? Это может решить вашу проблему.

person Archie1986    schedule 13.01.2010
comment
syncdb никогда не затрагивает существующие таблицы, так что это не решит проблему. Инструмент миграции, как и юг, будет. - person fest; 14.01.2010

Я пытался сделать то же самое и обнаружил, что начиная с django-south 0.5, юг не справляется с этим за вас.

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

use mydb;
desc mytable;

Это покажет вам схему для таблицы, и вы увидите, что поле по-прежнему будет иметь значение «UNI» в ключевом столбце.

SHOW INDEX FROM mytable FROM mydb;

Должен быть индекс, для которого Non_unique установлено в 0.

ALTER TABLE mytable DROP INDEX indexname;

Если вы снова посмотрите на схему таблицы, вы увидите, что «UNI» больше не находится в ключевом столбце.

person frederix    schedule 02.02.2010