2011-12-21 1 views
6

У меня уже есть модель,Как добавить один в один отношение поля в существующую модель по Южной миграции

class ModelA(models.Model): 
    name = models.CharField (max_length = 255, blank = False) 

и у меня есть много записей в нем. Теперь я хочу, чтобы добавить поле в нем, что

user = models.OneToOneField(User) 

Как добавить это поле в ModelA? Есть ли какое-либо решение, кроме удаления всех предыдущих записей?

+0

И в чем проблема? '--auto' не работает? – DrTyrsa

+0

'--auto' работает, но запрашивает значение по умолчанию для предыдущих записей? – Ahsan

+0

Поле 'user'' 'unique = True' и' null = False' – Ahsan

ответ

11

Я хотел бы использовать эту модель:

  1. Добавить "пользователя = models.OneToOneField (Пользователь, нуль = True)" для вашей модели (не удалить поле "имя")
  2. беги " manage.py schemamigration --auto '. И примените миграцию. Теперь в вашей таблице есть два столбца.
  3. Теперь создайте datamigration. Отредактируйте файл: вам нужно перебрать все объекты в вашей модели и установить поле пользователя.
  4. Из файла model.py удалите «name = models.CharField». И удалите значение null = True из поля пользователя.
  5. запустить 'manage.py schemamigration -auto'. И примените миграцию

BTW, если вы используете OneToOneField() без значения null = True, вы можете установить primary_key = True в этом поле, так как оно должно быть уникальным. Но я не знаю, сможет ли юг справиться с этой миграцией.

+0

после шага 5, когда вы собираетесь переносить, миграция просит добавить значение по умолчанию для пользователя, потому что он переходит в NOT NULL из состояния NULL. Итак, какова будет значение по умолчанию? пустая строка не работает :( – Ahsan

+0

Попробуйте 0 или отредактируйте файл миграции схемы создания и укажите по умолчанию 0. – guettli

+2

Точный же подход работает для переноса Django (без юга), с помощью «python manage.py makemigrations» для шаги 2 и 5. Спасибо! – mlncn