миграция Django south, не устанавливает значение по умолчанию
я использую юг для миграции моих моделей django. Однако на юге есть неприятный Жук. Он не устанавливает значения по умолчанию в базах данных Postgres. Пример:
created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)
South добавит эти 2 поля в базу данных, но не сможет установить их значения по умолчанию, что необходимо сделать вручную.
есть ли патч для этой ошибки?
обновление
Я уже пытался установить дату по умолчанию с auto_now_add=True
, но это также не установка значений по умолчанию. Добавление null=True
в поле добавляет db.alter_column
в сценарии миграции, производимом south. Но это только выводит NOT NULL
ограничение, не добавляет значение по умолчанию. Же целое поле
3 ответов
это не ошибка, на юге или в другом месте.
Я думаю, вы смущены тем, как значения по умолчанию работают в Django в целом. Django не устанавливает значения по умолчанию в схеме базы данных. Он применяет их непосредственно в Python, когда создается новый экземпляр. Вы можете проверить это, выполнив manage.py sqlall
и убедитесь, что сгенерированный SQL не содержит default
атрибуты.
Если вы автоматически генерируете свои миграции, используя:
./manage.py schemamigration app_name --auto
затем вам нужно сделать небольшое редактирование миграции, прежде чем вы фактически примените его. Перейдите в сгенерированную миграцию (следует назвать что-то вроде app_name/migrations/000X__auto_add_field_foo.py) и ищите аргумент:
keep_default=False
в БД.add_column звонок. Просто измените это:
keep_default=True
и Django теперь применит ваше значение по умолчанию к фактической схеме, в дополнение к любые существующие строки. Было бы здорово, если бы у South была какая-то настройка для генерации этого параметра как True по умолчанию, но не такая удача. Вам нужно будет сделать это редактирование каждый раз.
как упоминалось в предыдущих ответах, механизм по умолчанию в django реализован в классе model и не имеет отношения к миграции на юг.
кроме того, с юга 0.8,на keep_default
флаг устарел, и не добавит значение по умолчанию к вашей модели.
для решения этой проблемы я пишу пользовательскую миграцию, чтобы добавить значение по умолчанию. Вы можете сделать это, создав отдельный миграция данных:
./manage.py datamigration your_app_name migration_name
и добавить следующая строка в :
orm.YourModel.objects.update(field_name = DEFAULT_VALUE)
кроме того, вместо создания новой миграции можно изменить исходную миграцию:
- добавить
no_dry_run = True
к самому классу (так что у вас будет доступ к ORM). - добавить
orm.YourModel.objects.update(field_name = DEFAULT_VALUE)
до конца .
таким образом, вам не нужно писать обратную миграцию, потому что у вас уже есть исходный столбец удаления.