Quiero agregar un campo ForeignKey
a mi modelo. Para lograr eso, hice 3 pasos:En una migración de esquema, ¿cuál debería ser el valor predeterminado para un campo nulo = Falso que estoy seguro de que no tendrá valores nulos?
- Agregado el campo
ForeignKey
connull=True
a mi modelo y, a continuación, creé unaschemamigration
. - Creado un
datamigration
para completar esa clave externa con un valor razonable. Después de aplicar esta migración, estoy bastante seguro de que no queda ningún objeto con un valor NULL en ese campo. - Cambió ese campo
ForeignKey
anull=False
, y luego creó otroschemamigration
.
Sin embargo, estoy teniendo problemas en el paso 3 :
? The field 'MyModel.fkfield' does not have a default specified, yet is NOT NULL.
? Since you are making this field non-nullable, you MUST specify a default
? value to use for existing rows. Would you like to:
? 1. Quit now, and add a default to the field in models.py
? 2. Specify a one-off value to use for existing columns now
? Please select a choice:
Bueno ... No tiene sentido valor predeterminado para este campo, y también por ahora estoy bastante seguro de que nadie objeto tiene ese campo como NULL. Entonces ... No sé cómo responder esta pregunta correctamente. Si pudiera, diría "no establezca ningún valor predeterminado y genere un error si encuentra NULL en esa columna".
Por ahora, como solución alternativa para superar esa pregunta, elijo la opción 2
y luego el uso de 1
como el valor predeterminado único. Esta es una solución bastante mala, pero al menos south
no se queja y crea la migración.
- ¿Cuál es la forma correcta de cambiar un campo en
NOT NULL
? (usandosouth
) - ¿Qué debo hacer cuando
south
me pide un valor predeterminado para un campo que no debería tener uno?
Estoy usando django-1.2
y south-0.7
.
pregunta relacionada: Django South - turning a null=True field into a null=False field
Documentación relacionada: Part 3: Advanced Commands and Data Migrations
(nota: aquí en StackOverflow tenemos dos etiquetas que parecen iguales para mí: "Django-sur" y "sur", pero no tengo suficiente reputación para sugerir sinónimos)
Generalmente, dejo NULL en todos los campos. Esto puede ser considerado como una mala práctica por algunos, pero personalmente creo que la restricción de que algo debe tener un valor debe aplicarse en la aplicación que no está en la base de datos. –
@ChrisPratt Eso está bien en teoría, pero ¿qué sucede cuando más que una aplicación que se comporta bien es acceder a la base de datos? –