Как обновить базу данных с помощью phpmyadmin, когда я добавляю ForeignKey в django?

У меня модель django:

#models.py

class m1(models.Model):
    some_word = models.CharField()

Я создал базу данных с помощью команды manage.py syncdb, а затем добавил поле ForeignKey в модель.

#models.py

from django.contrib.auth.models import User
class m1(models.Model):
    some_word = models.CharField()
    user = models.ForeignKey(User)

Насколько я знаю, собственный django не поддерживает модификацию db, поэтому мне нужно создать столбец user_id вручную. Хорошо, я захожу в phpmyadmin и создаю этот столбец. На данный момент все в порядке, приложение работает. Но потом я понимаю, что мне нужна опция blank = True в пользовательском поле:

#models.py

from django.contrib.auth.models import User
class m1(models.Model):
    some_word = models.CharField()
    user = models.ForeignKey(User, blank = True)

И при сохранении любого объекта m1 я получил ошибку «Невозможно присвоить None:« m1.user »не допускает нулевые значения». Я знаю, что если я удалю таблицу и сделаю это с помощью syncdb, все будет хорошо, и если я использую инструмент миграции, такой как South, все будет в порядке. Но я хочу понять механику этого и выяснить, что не так с db.

Я вызываю «manage.py sqlall app», и оно сообщает «СОЗДАТЬ ТАБЛИЦУ» и создает индексы:

CREATE INDEX `app_m1_a703c35a` ON `app_m1` (`user_id`);

ALTER TABLE `app_m1` ADD CONSTRAINT `user_id_refs_id_5b1b34cc` 
FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);

Хорошо, я захожу в phpmyadmin и делаю этот sql-материал (честно говоря, я не знаю, что делают эти индексы). Но ошибка все равно возникает. Что я должен делать?


person Павел Тявин    schedule 07.08.2012    source источник


Ответы (1)


Во-первых, вы должны использовать South для выполнения этих миграций базы данных за вас, особенно если вы признаете, что действительно не понимаете, что происходит.

Во-вторых, ошибка не в том, что отсутствует blank=True, а в том, что отсутствует null=True, что совсем другое. Документация хорошо это объясняет.

person Daniel Roseman    schedule 07.08.2012