2009-05-06 2 views
51

У меня есть небольшой сайт с несколькими пользователями, и я бы хотел добавить поле к одной из моих моделей (и, следовательно, к таблицам.) Проблема в том, что syncdb, конечно, не будет коснитесь существующих моделей, и я пытаюсь понять, как добавить это поле в модель/таблицу, не переписывая всю вещь.Добавление поля в существующую модель Django

Пример:

class Newspaper(models.Model): 
    name = models.CharField() 

class UserProfile(models.Model): 
    user = models.ForeignKey(user, unique=True) 
    reads = models.ManyToManyField(Newspaper) 

Теперь я хотел бы добавить поле URL (blank=True) к Newspaper модели, не нарушая пользовательских профилей.

Любые идеи?

ответ

38

Для этого не существует встроенного способа. Однако существует ряд сторонних проектов, которые сделают это для вас. Два ведущих из них называются South и django-evolution, хотя есть и другие другие (в том числе один, с которым я связан, dmigrations).

Я бы определенно рекомендовал Юг - у него есть несколько действительно опрятных функций и работает очень хорошо.

+0

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

+4

Не могли бы вы рассказать нам, как? – holmeswatson

+1

И спустя годы Юг теперь является частью ядра Django. –

18

Вы могли бы попробовать получение SQL для нового поля с помощью:

manage.py sql appname 

Где appname это имя приложения, в котором классовые газета живет.

Затем вы можете вручную добавить поле в свою таблицу appname_newspaper, используя ALTER TABLE. Я не знаю, как это сделать непосредственно с Django, поскольку Django не поддерживает миграции.

+0

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

1

2015 Ответ:

Выполните следующие действия:

python manage.py makemigrations 
python manage.py migrate 

 Смежные вопросы

  • Нет связанных вопросов^_^