inspectdb - django mysql
Modelos Django: valor por defecto para columna (2)
Tengo el siguiente código de modelo de Django
:
status = models.PositiveIntegerField(default = 0b000)
comments_allowed = models.BooleanField(default = True) # whether comments are allowed to this post
Pero esperaba, generaría SQL como
`status` integer NOT NULL default ''4'',
`comments_allowed` bool NOT NULL default TRUE
Lo que no está sucediendo y cuando ejecuto manage.py sqlall appname
produce:
`status` integer UNSIGNED NOT NULL,
`comments_allowed` bool NOT NULL
Profundizar en el código de Django
y buscar en Google no me dio nada, pero el comentario de James Bennet de que el default
no se supone que afecte a la generación de SQL
, pero es necesario para el administrador de Django. Incluso si es así, ¿cómo obtengo el efecto deseado?
Mi versión de Django
es 1.3.0 final
La única solución permanente es parchear la fuente de Django, específicamente db / backends / creation.py:
Encontrar:
if f.primary_key:
field_output.append(style.SQL_KEYWORD(''PRIMARY KEY''))
elif f.unique:
field_output.append(style.SQL_KEYWORD(''UNIQUE''))
Después de añadir:
if(f.default != models.fields.NOT_PROVIDED):
field_output.append(style.SQL_KEYWORD(''DEFAULT '' + str(f.default)))
(Fuente: http://www.supermind.org/blog/671/django-not-setting-default-column-value-in-mysql )
Alternativamente (y de preferencia), si está utilizando South, puede ejecutar algo de SQL adicional después de db.create_table
en su migración:
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")
Tenga en cuenta que el parámetro default
también puede tomar un objeto llamable: https://docs.djangoproject.com/en/dev/ref/models/fields/#default . ¡Ese es ciertamente un comportamiento que no se puede reproducir en SQL! Entonces, no sería posible para Django generar SQL para cada caso posible. Parece que, en aras de la simplicidad y la coherencia, han optado por no generar SQL para cualquier caso.