миграция 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)

кроме того, вместо создания новой миграции можно изменить исходную миграцию:

  1. добавить no_dry_run = True к самому классу (так что у вас будет доступ к ORM).
  2. добавить orm.YourModel.objects.update(field_name = DEFAULT_VALUE) до конца .

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