nula = True en blanco = True por defecto = 0En Django models.py, ¿cuál es la diferencia entre predeterminado, nulo y en blanco?
Cuál es la diferencia? ¿Cuándo usas qué?
nula = True en blanco = True por defecto = 0En Django models.py, ¿cuál es la diferencia entre predeterminado, nulo y en blanco?
Cuál es la diferencia? ¿Cuándo usas qué?
directo desde Django model field reference:
Field.null
Si
True
, Django almacenará valores vacíos comoNULL
en la base de datos. El valor predeterminado esFalse
.Tenga en cuenta que los valores de cadenas vacías siempre se almacenarán como cadenas vacías, no como
NULL
. Solo usenull=True
para campos que no sean cadenas como enteros, booleanos y fechas. Para ambos tipos de campos, también deberá establecerblank=True
si desea permitir valores vacíos en formularios, ya que el parámetronull
solo afecta el almacenamiento de la base de datos (consulteblank
).Evite utilizar
null
en campos basados en cadenas comoCharField
yTextField
a menos que tenga un motivo excelente. Si un campo basado en cadena tienenull=True
, eso significa que tiene dos valores posibles para "sin datos": NULL y la cadena vacía. En la mayoría de los casos, es redundante tener dos valores posibles para "sin datos"; la convención Django es usar la cadena vacía, noNULL
.
Field.blank
Si
True
, el campo se deja en blanco. El valor predeterminado esFalse
.Tenga en cuenta que esto es diferente de
null
.null
está puramente relacionado con la base de datos, mientras queblank
está relacionado con la validación. Si un campo tieneblank=True
, la validación en el sitio de administración de Django permitirá la entrada de un valor vacío. Si un campo tieneblank=False
, se requerirá el campo.
Field.default
El valor predeterminado para el campo. Esto puede ser un valor o un objeto invocable. Si se llama, se llamará cada vez que se cree un nuevo objeto.
¿No entiende todo esto?
De docs:
null
Si es True, Django almacenará vacías como valores NULL en la base de datos. El valor predeterminado es False.
blank
Si es verdadero, el campo está permitido en en blanco. El valor predeterminado es falso.
default
El valor predeterminado para el campo .
Puede usar "default
" para establecer el valor que se utilizará para el campo en cuestión si su código no lo establece explícitamente en un valor.
Uso "blank
" para fines de validación de formularios - espacio en blanco = True permitirá el campo para ser ajustado a un valor vacío
Uso "null
" si desea almacenar un valor vacío como "nulo" en el DB. Sin embargo, a menudo se prefiere establecer valores en blanco en una cadena vacía o en 0 según corresponda para un campo dado.
Null = None
Blank = ""
Default = ""
Es probablemente lo más sencillo posible.
En blanco implica que NO es NULO y en su lugar tiene algún valor que representa "en blanco" para ese tipo de datos, que en el caso de una cadena es probablemente una cadena vacía. Para los números que podría ser 0.
En términos de implementación:
El campo 'en blanco' corresponde a todas las formas. Especifica si este valor se requiere en el formulario y se realiza la validación de formulario correspondiente. 'Verdadero' permite valores vacíos.
El campo 'nulo' corresponde al nivel de DB. Se establecerá como NULL o NOT NULL en la base de datos.
Por lo tanto, si deja un campo vacío en la administración con blank = true, NULL se alimenta a la base de datos. Ahora esto podría generar un error si esa columna en particular en el DB se especifica como NOT NULL.
Creo que esto puede no estar claro para todos: para que un IntegerField sea anulable en ambas formas y db es necesario tener tanto null = True como blank = True. Ver: https://code.djangoproject.com/wiki/NewbieMistakes#IntegerNULLS – fjsj
Creo que debería ser abordado por la comunidad Django porque es muy confuso. "Solo use null = True para campos que no sean cadenas como enteros" Django podría manejarlo de la misma manera que maneja auto_now y auto_now_add. "Las opciones auto_now, auto_now_add y por defecto son mutuamente excluyentes. Solo una de estas opciones puede estar presente." – Gregory
@Gregory: como se explicó, 'null' se trata del almacenamiento de la base de datos. Django está exponiendo un aspecto útil pero comparativamente peligroso de las bases de datos SQL. Realmente es algo que debe explicarse en la documentación en lugar de limitarse o aplicarse en el código; no hay ninguna limitación que pueda aplicarse sin romper funcionalidades útiles (aunque potencialmente rincón). –