Подтвердить что ты не робот

Модели Django: значение по умолчанию для столбца

У меня следующий код модели Django:

status = models.PositiveIntegerField(default = 0b000)
comments_allowed = models.BooleanField(default = True) # whether comments are allowed to this post

Но я ожидал, что он будет генерировать SQL как

`status` integer NOT NULL default '4',
`comments_allowed` bool NOT NULL default TRUE

Что не происходит, и когда я запускаю manage.py sqlall appname, он производит:

`status` integer UNSIGNED NOT NULL,
`comments_allowed` bool NOT NULL

Вступление в код Django и googling ничего мне не дали, но Джеймс Беннет прокомментировал, что default не предполагается влиять на создание SQL, но необходимо для администратора Django. Даже если это так, как мне получить желаемый эффект?

Моя версия Django - это 1.3.0 final

4b9b3361

Ответ 1

Обратите внимание, что параметр default также может принимать вызываемый объект: https://docs.djangoproject.com/en/dev/ref/models/fields/#default. Это, безусловно, поведение, которое невозможно воспроизвести в SQL! Поэтому Django не сможет генерировать SQL для каждого возможного случая. Похоже, что для простоты и согласованности они решили не генерировать SQL для любого случая.

Ответ 2

Единственное постоянное решение - исправить источник Django, в частности db/backends/creation.py:

Поиск:

if f.primary_key:
    field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
elif f.unique:
    field_output.append(style.SQL_KEYWORD('UNIQUE'))

После добавления:

if(f.default != models.fields.NOT_PROVIDED):
    field_output.append(style.SQL_KEYWORD('DEFAULT ' + str(f.default)))

(Источник: http://www.supermind.org/blog/671/django-not-setting-default-column-value-in-mysql)

Альтернативно (и предпочтительно), если вы используете Юг, вы можете просто выполнить дополнительный SQL после db.create_table в своей миграции:

MySQL:

db.execute("ALTER TABLE yourapp_yourmodel MODIFY status int Default '4'")

Postgres:

db.execute("ALTER TABLE yourapp_yourmodel ALTER COLUMN status SET DEFAULT 4")