Cuando agregamos un campo de base de datos en django, generalmente escribimos:
models.CharField(max_length=100, null=True, blank=True)
Lo mismo se hace con ForeignKey
, DecimalField
etc. ¿Cuál es la diferencia básica en tener
null=True
solamenteblank=True
solamentenull=True
,blank=True
con respecto a diferentes ( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
campos). ¿Cuáles son las ventajas / desventajas de usar 1/2/3?
python
django
django-models
user993563
fuente
fuente
ForeignKey
conblank=True
, pero sinnull=True
. Cuando se guarda el modelo, quiero "publicarlo" automáticamente creando una entrada publicada a partir de él. Por lo tanto, no puedo guardarnull
en la base de datos, ya que cada modelo tiene que ser "publicado", pero quiero poder dejar el campo vacío en admin.Respuestas:
null=True
estableceNULL
(versusNOT NULL
) en la columna en su base de datos. Los valores en blanco para los tipos de campo de Django, comoDateTimeField
oForeignKey
se almacenarán comoNULL
en la base de datos.blank
determina si el campo será requerido en los formularios. Esto incluye el administrador y sus formularios personalizados. Si esblank=True
así, el campo no será obligatorio, mientras que si esFalse
el campo no puede estar en blanco.La combinación de ambos es muy frecuente porque, por lo general, si va a permitir que un campo esté en blanco en su formulario, también necesitará su base de datos para permitir
NULL
valores para ese campo. La excepción esCharField
sysTextField
, que en Django nunca se guardan comoNULL
. Los valores en blanco se almacenan en la base de datos como una cadena vacía (''
).Algunos ejemplos:
Obviamente, esas dos opciones no tienen sentido lógico de usar (aunque podría haber un caso de uso para
null=True, blank=False
si desea que un campo siempre se requiera en formularios, opcional cuando se trata de un objeto a través de algo como el shell).CHAR
y losTEXT
tipos nunca se guardan comoNULL
Django, por lo quenull=True
es innecesario. Sin embargo, puede configurar manualmente uno de estos camposNone
para forzar la configuración comoNULL
. Si tiene un escenario donde eso podría ser necesario, aún debe incluirlonull=True
.fuente
IntegrityError
se genera cuando Django intenta guardar el registro en la base de datos. El usuario no necesita completar el campo, y ese es el problema porque a nivel de la base de datos no es nulo.CHAR
y DjangoTEXT
NUNCA los guardeNULL
". Es cierto para la mayoría de los backends, pero Oracle forzará una cadena vacía a NULL, por lo que el backend Django Oracle es una excepción a la declaración anterior Django DocsNone
en Python) si establece null = True. Los documentos incluso dicen que se evite establecer null = True porque permite dos tipos diferentes de valores "en blanco". Acabo de probar este comportamiento con Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?Así es como los mapas
blank
ynull
campos ORM para Django 1.8Los campos de la base de datos creados para PostgreSQL 9.4 son:
Los campos de la base de datos creados para MySQL 5.6 son:
fuente
blank
no tiene ningún efecto en la base de datos ynull
controla si la columna de la base de datos permiteNULL
valores. Esta respuesta es una forma muy larga de decir eso, y no proporciona ninguna información útil sobreblank
.blank
ynull
debe reflejarse en las columnas de la base, cuando en realidadblank
sólo afecta el manejo de Python, no columnas de base de datos. Otros son libres de votar si lo encuentran útil; También es posible que las personas que son engañadas por una respuesta engañosa piensen que fue útil.Como se dijo en la referencia del campo modelo de Django: Enlace
fuente
Es crucial comprender que las opciones en una definición de campo de modelo de Django tienen (al menos) dos propósitos: definir las tablas de la base de datos y definir el formato predeterminado y la validación de los formularios del modelo. (Digo "predeterminado" porque los valores siempre se pueden anular proporcionando un formulario personalizado). Algunas opciones afectan la base de datos, algunas opciones afectan a los formularios y otras afectan a ambos.
Cuando se trata de
null
yblank
, otras respuestas ya han dejado en claro que la primera afecta la definición de la tabla de la base de datos y la segunda afecta la validación del modelo. Creo que la distinción puede hacerse aún más clara al ver los casos de uso para las cuatro configuraciones posibles:null=False
,blank=False
: Esta es la configuración predeterminada y significa que el valor es obligatorio en todas las circunstancias.null=True
,blank=True
: Esto significa que el campo es opcional en todas las circunstancias. (Sin embargo, como se indica a continuación, esta no es la forma recomendada de hacer que los campos basados en cadenas sean opcionales).null=False
,blank=True
: Esto significa que el formulario no requiere un valor, pero la base de datos sí. Hay varios casos de uso para esto:El uso más común es para campos opcionales basados en cadenas. Como se señala en la documentación , el idioma de Django es usar la cadena vacía para indicar un valor faltante. Si
NULL
también se permitiera, terminaría con dos formas diferentes de indicar un valor faltante.Otra situación común es que desea calcular un campo automáticamente en función del valor de otro (en su
save()
método, por ejemplo). No desea que el usuario proporcione el valor de una forma (por lo tantoblank=True
), pero sí desea que la base de datos haga cumplir que siempre se proporcione un valor (null=False
).Otro uso es cuando desea indicar que a
ManyToManyField
es opcional. Debido a que este campo se implementa como una tabla separada en lugar de una columna de base de datos, nonull
tiene sentido . Sinblank
embargo, el valor de seguirá afectando a las formas, controlando si la validación tendrá éxito o no cuando no haya relaciones.null=True
,blank=False
: Esto significa que el formulario requiere un valor pero la base de datos no. Esta puede ser la configuración que se usa con menos frecuencia, pero existen algunos casos de uso:Es perfectamente razonable exigir a sus usuarios que siempre incluyan un valor, incluso si su lógica empresarial no lo requiere realmente. Después de todo, los formularios son solo una forma de agregar y editar datos. Es posible que tenga un código que genera datos que no necesita la misma validación estricta que desea exigir a un editor humano.
Otro caso de uso que he visto es cuando tiene uno
ForeignKey
para el que no desea permitir la eliminación en cascada . Es decir, en el uso normal, la relación siempre debe estar allí (blank=False
), pero si lo que señala se elimina, no desea que este objeto también se elimine. En ese caso, puede usarnull=True
eon_delete=models.SET_NULL
implementar un tipo simple de eliminación suave .fuente
Es posible que tenga su respuesta, sin embargo, hasta el día de hoy es difícil juzgar si poner null = True o blank = True o ambos en un campo. Personalmente, creo que es bastante inútil y confuso proporcionar tantas opciones a los desarrolladores. Deje que manejen los nulos o espacios en blanco como quieran.
Sigo esta tabla, de Two Scoops of Django :
fuente
Simplemente
null=True
define que la base de datos debe aceptarNULL
valores, por otro lado,blank=True
define en la validación del formulario, este campo debe aceptar valores en blanco o no (siblank=True
acepta el formulario sin un valor en ese campo yblank=False
[valor predeterminado] en la validación del formulario, se mostrará Este campo es un error obligatorio .null=True/False
relacionado con la base de datosblank=True/False
relacionado con la validación de formulariosfuente
Aquí hay un ejemplo del campo con
blank= True
ynull=True
descripción = modelos.TextField (en blanco = verdadero, nulo = verdadero)
En este caso::
blank = True
le dice a nuestro formulario que está bien dejar el campo de descripción en blancoy
null = True
: le dice a nuestra base de datos que está bien registrar un valor nulo en nuestro campo db y no dar un error.fuente
Significa que no hay restricción de la base de datos para que el campo se complete, por lo que puede tener un objeto con valor nulo para el relleno que tiene esta opción.
Significa que no hay restricción de validación en los formularios de django. así que cuando complete un
modelForm
para este modelo, puede dejar el campo con esta opción sin completar.fuente
Aquí, es la principal diferencia de
null=True
yblank=True
:El valor predeterminado de ambos
null
yblank
es False. Ambos valores funcionan a nivel de campo, es decir, si queremos mantener un camponull
oblank
.null=True
establecerá el valor del campo enNULL
, es decir, sin datos. Básicamente es para el valor de la columna de bases de datos.blank=True
determina si el campo será requerido en los formularios. Esto incluye el administrador y sus propios formularios personalizados.title = models.CharField(blank=True) // title can be kept blank.
En la base de datos("")
se almacenará.null=True
blank=True
Esto significa que el campo es opcional en todas las circunstancias.fuente
Los valores predeterminados de nulo y en blanco son falsos.
Nulo: está relacionado con la base de datos. Define si una columna de base de datos determinada aceptará valores nulos o no.
En blanco: está relacionado con la validación. Se usará durante la validación de formularios, al llamar a form.is_valid ().
Dicho esto, está perfectamente bien tener un campo con nulo = Verdadero y en blanco = Falso. Es decir, en el nivel de la base de datos, el campo puede ser NULL, pero en el nivel de la aplicación es un campo obligatorio.
Ahora, donde la mayoría de los desarrolladores se equivocan: Definir null = True para campos basados en cadenas como CharField y TextField. Evita hacer eso. De lo contrario, terminará teniendo dos valores posibles para "sin datos", es decir: Ninguno y una cadena vacía. Tener dos valores posibles para "sin datos" es redundante. La convención de Django es usar la cadena vacía, no NULL.
fuente
Cuando guardamos algo en el administrador de Django, se realiza la validación de dos pasos, en el nivel de Django y en el nivel de la base de datos. No podemos guardar texto en un campo numérico.
La base de datos tiene el tipo de datos NULL, no es nada. Cuando Django crea columnas en la base de datos, especifica que no pueden estar vacías. Y si intenta guardar NULL, obtendrá el error de la base de datos.
También en el nivel Django-Admin, todos los campos son obligatorios por defecto, no puede guardar el campo en blanco, Django le arrojará un error.
Por lo tanto, si desea guardar el campo en blanco, debe permitirlo en el nivel de Django y Base de datos. blank = True - permitirá un campo vacío en el panel de administración null = True - permitirá guardar NULL en la columna de la base de datos.
fuente
Hay un punto en el
null=True
que sería necesario incluso en unCharField
oTextField
y es cuando la base de datos tiene launique
bandera establecida para la columna.En otras palabras, si tiene un Char / TextField único en Django, deberá usar esto:
Para CharField o TextField no únicos, será mejor omitirlo; de lo
null=True
contrario, algunos campos se establecerán como NULL mientras que otros como "", y deberá verificar el valor del campo para NULL cada vez.fuente
nulo es para la base de datos y en blanco es para la validación de campos que desea mostrar en la interfaz de usuario como el campo de texto para obtener el apellido de la persona. Si lastname = models.charfield (blank = true) no le pidió al usuario que ingrese el apellido ya que este es el campo opcional ahora. Si lastname = models.charfield (null = true) significa que si este campo no obtiene ningún valor del usuario, se almacenará en la base de datos como una cadena vacía "".
fuente
El significado de null = True y blank = True en el modelo también depende de cómo se definieron estos campos en la clase de formulario.
Supongamos que ha definido la siguiente clase:
Si la clase de formulario se ha definido así:
Entonces, el campo 'nombre' no será obligatorio (debido al espacio en blanco = Verdadero en el modelo) y el campo 'dirección' será obligatorio (debido al espacio en blanco = Falso en el modelo).
Sin embargo, si la clase ClientForm se ha definido así:
Entonces, ambos campos ('nombre' y 'dirección') serán obligatorios, "ya que los campos definidos declarativamente se dejan como están" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) , es decir, el valor predeterminado para el atributo 'requerido' del campo de formulario es True y esto requerirá que se llenen los campos 'nombre' y 'dirección', incluso si, en el modelo, el campo se ha configurado en blanco = True.
fuente
nulo: el valor predeterminado es Falso si es verdadero, Django se almacenará vacío como nulo en la base de datos.
en blanco: el valor predeterminado es False si es cierto que el campo puede estar en blanco
más, vaya a https://docs.djangoproject.com/en/3.0/topics/db/models/
fuente
La siguiente tabla muestra las principales diferencias:
fuente
En palabras muy simples ,
En blanco es diferente de nulo.
nulo está puramente relacionado con la base de datos , mientras que el blanco está relacionado con la validación (requerido en el formulario) .
Si
null=True
, Django lo harástore empty values as NULL in the database
. Si un campo tieneblank=True
, la validación del formulario lo haráallow entry of an empty value
. Si un campo tiene en blanco = Falso, el campo será obligatorio.fuente