2011-06-20 11 views
17

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?

  1. Agregado el campo ForeignKey con null=True a mi modelo y, a continuación, creé una schemamigration.
  2. 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.
  3. Cambió ese campo ForeignKey a null=False, y luego creó otro schemamigration.

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? (usando south)
  • ¿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)

Respuesta

15

Solo una idea: Dado que se trata de una clave externa, puede establecer el valor predeterminado en un registro que sabe que nunca tendrá un registro referenciado, es decir 0 o -1. Su db generará un error si South intentará usar este valor predeterminado.

+0

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. –

+7

@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? –

Cuestiones relacionadas