multiple inspectdb databases create mysql django django-models

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.