2011-09-27 23 views
7

Me parece que cuando inserto nada de una cadena form field a través de un formulario, lo captura como una cadena vacía ''.django nulo y cadena vacía

Sin embargo, cuando no inserto nada de un entero form field a través de un formulario, lo captura como [null].

¿Es esta una buena práctica? ¿Debe la cadena ser null también en el db?

Respuesta

5

Es una buena práctica. Si se permitiera que las cadenas fueran null, habría dos formas de tener una cadena vacía: null y "". Esto le da múltiples valores para controlar, que es ineficiente y desordenado.

Esta es una Django convention, pero es una buena práctica en todas las aplicaciones, a menos que tenga la necesidad de null a significar algo diferente de lo"".

+7

Si en mi base de datos configuro un campo para PERMITIR NULO, entonces espero que ninguno se almacene como NULL, no como una cadena vacía. Está bien que Django tenga sus convenciones, pero Django no es necesariamente el único sistema que accede a la base de datos. Si una aplicación por separado puede almacenar NULL, entonces tendrá que seguir buscando cadena vacía o nula. Sin embargo, un simple 'if not value' comprobará ambos en Python. – six8

+6

Podría ser una "práctica django", pero en las bases de datos en general, usar la cadena vacía para representar los datos faltantes es una mala práctica. Para eso es NULL. Realmente me gustaría que esto no fuera una práctica estándar en django. – Darren

+0

No es una buena práctica, es una convención introducida en los primeros días, por no tener que manejar 'None' en las plantillas y no tener que limpiar los campos de formulario en blanco en' None'. Era un atajo para hacer las cosas rápidamente, pero ahora deberíamos justificarlo como una buena práctica, porque era la pereza o la falta de tiempo lo que nos permitía esta "práctica". Es por eso que ahora tenemos 2 atributos de campo manejando esto. –

1

Creo que la cadena también debería ser NULL, pero depende de su aplicación, consulte MySQL, better to insert NULL or empty string?.

Si desea almacenar valores NULL para un campo vacío, agregue null=True al campo en cuestión. Ver https://docs.djangoproject.com/en/dev/ref/models/fields/#null

+2

que es incorrecto ... – zentenk

+0

¿Cómo es esto incorrecto? – six8

+2

Prefiero saber si el valor fue establecido, incluso si lo configuré en una cadena vacía vs no establecida (nula). Esto, por supuesto, depende de su preferencia y/o aplicación. En cualquier caso, di mi opinión sobre las mejores prácticas y di instrucciones sobre cómo habilitarla con Django. – six8

0

Depende del atributo field.empty_strings_allowed.

Algunos campos lo tienen anulado a False. Pero CharField lo mantiene True, por lo que Field._get_default devuelve cadena vacía como valor predeterminado, incluso si blank=True. La única forma de obtener None como valor predeterminado es tener null=True en un campo.

Por lo tanto, si tiene un campo en db que nunca debe ser nulo y no permita que los espacios en blanco nunca sean guardados allí, por ej. objects.create. Necesita poner self.full_clean() - u otra validación - en el método del modelo save.

Cuestiones relacionadas