django южная миграция, не устанавливается по умолчанию - PullRequest
8 голосов
/ 03 апреля 2012

Я использую юг, чтобы перенести мои модели Django. Однако на юге есть неприятная ошибка. Он не устанавливает значения по умолчанию в базах данных Postgres. Пример:

created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)

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

Есть ли патч для этой ошибки?

UPDATE Я уже пытался установить дату по умолчанию с помощью auto_now_add=True, но это также не установка значений по умолчанию. Добавление null=True в поле добавляет db.alter_column в сценарий миграции, созданный на юге. Но это только снимает ограничение NOT NULL, не добавляет значение по умолчанию. То же самое для целочисленного поля

Ответы [ 3 ]

21 голосов
/ 04 октября 2012

Если вы автоматически генерируете свои миграции, используя:

./manage.py schemamigration app_name --auto

Затем вам нужно внести небольшое изменение в миграцию, прежде чем вы на самом деле примените ее.Перейдите к сгенерированной миграции (должно называться что-то вроде app_name / migrations / 000X__auto_add_field_foo.py) и найдите аргумент:

keep_default=False

в вызове db.add_column.Просто измените это на:

keep_default=True

И Django теперь применит ваше значение по умолчанию к фактической схеме, в дополнение к любым существующим строкам.Было бы замечательно, если бы Юг имел какую-то настройку для генерации этого параметра как True по умолчанию, но не такая удача.Вам нужно будет делать это редактирование каждый раз.

11 голосов
/ 03 апреля 2012

Это не ошибка ни на юге, ни в другом месте.

Я думаю, вы не понимаете, как работают значения по умолчанию в Django. Django не устанавливает значения по умолчанию в схеме базы данных. Он применяет их непосредственно в Python, когда создается новый экземпляр. Вы можете проверить это, выполнив manage.py sqlall и увидев, что сгенерированный SQL не содержит default атрибутов.

2 голосов
/ 09 апреля 2014

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

Кроме того, поскольку юг 0,8, флаг keep_defaultустарела и не добавит значение по умолчанию для вашей модели.

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

./manage.py datamigration your_app_name migration_name

и добавив следующую строку в функцию forwards:

orm.YourModel.objects.update(field_name = DEFAULT_VALUE)

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

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

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

...