Модели 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
Ответы
Ответ 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")