2010-01-13 4 views
0

У меня есть модель с CharField, у которой раньше была уникальная опция True, но теперь она изменена на False. Но когда я пытаюсь сохранить это поле с чем-то, что существует, django все равно бросает IntegrityError.Изменить с "unqiue = True" на "unique = False" в django

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

База данных - это MySQL.

ответ

1

Оставьте уникальный указатель.

+1

Я предполагаю, что вы имеете в виду падения уникального индекса на таблице MySQL? (просто чтобы избежать путаницы для людей, новых для Django, которые могут подумать, что индекс должен быть сброшен в модели Django). –

+0

Это действительно то, что я имею в виду. –

+0

Хорошо, я попытался: 'ALTER TABLE 'tblname' DROP INDEX' fieldname'' Но это не сработало. Все еще ошибка целостности. – espenhogbakk

0

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

+0

syncdb никогда не касается существующих таблиц, поэтому это не решит проблему. Инструмент миграции, подобно югу, будет. – fest

0

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

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

use mydb; 
desc mytable; 

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

SHOW INDEX FROM mytable FROM mydb; 

Должно быть индекс, который имеет Non_unique набор 0.

ALTER TABLE mytable DROP INDEX indexname; 

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

2

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

И используя это так просто, как то, что они написали здесь: http://south.aeracode.org/wiki/ConvertingAnApp