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, DecimalFieldetc. ¿Cuál es la diferencia básica en tener
null=Truesolamenteblank=Truesolamentenull=True,blank=True
con respecto a diferentes ( CharField, ForeignKey, ManyToManyField, DateTimeFieldcampos). ¿Cuáles son las ventajas / desventajas de usar 1/2/3?
python
django
django-models
user993563
fuente
fuente

ForeignKeyconblank=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 guardarnullen la base de datos, ya que cada modelo tiene que ser "publicado", pero quiero poder dejar el campo vacío en admin.Respuestas:
null=TrueestableceNULL(versusNOT NULL) en la columna en su base de datos. Los valores en blanco para los tipos de campo de Django, comoDateTimeFieldoForeignKeyse almacenarán comoNULLen la base de datos.blankdetermina si el campo será requerido en los formularios. Esto incluye el administrador y sus formularios personalizados. Si esblank=Trueasí, el campo no será obligatorio, mientras que si esFalseel 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
NULLvalores para ese campo. La excepción esCharFieldsysTextField, 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=Falsesi desea que un campo siempre se requiera en formularios, opcional cuando se trata de un objeto a través de algo como el shell).CHARy losTEXTtipos nunca se guardan comoNULLDjango, por lo quenull=Truees innecesario. Sin embargo, puede configurar manualmente uno de estos camposNonepara forzar la configuración comoNULL. Si tiene un escenario donde eso podría ser necesario, aún debe incluirlonull=True.fuente
IntegrityErrorse 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.CHARy DjangoTEXTNUNCA 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 DocsNoneen 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
blankynullcampos 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
blankno tiene ningún efecto en la base de datos ynullcontrola si la columna de la base de datos permiteNULLvalores. Esta respuesta es una forma muy larga de decir eso, y no proporciona ninguna información útil sobreblank.blankynulldebe reflejarse en las columnas de la base, cuando en realidadblanksó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
nullyblank, 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
NULLtambié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
ManyToManyFieldes opcional. Debido a que este campo se implementa como una tabla separada en lugar de una columna de base de datos, nonulltiene sentido . Sinblankembargo, 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
ForeignKeypara 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=Trueeon_delete=models.SET_NULLimplementar 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=Truedefine que la base de datos debe aceptarNULLvalores, por otro lado,blank=Truedefine en la validación del formulario, este campo debe aceptar valores en blanco o no (siblank=Trueacepta 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/Falserelacionado con la base de datosblank=True/Falserelacionado con la validación de formulariosfuente
Aquí hay un ejemplo del campo con
blank= Trueynull=Truedescripción = modelos.TextField (en blanco = verdadero, nulo = verdadero)
En este caso::
blank = Truele 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
modelFormpara este modelo, puede dejar el campo con esta opción sin completar.fuente
Aquí, es la principal diferencia de
null=Trueyblank=True:El valor predeterminado de ambos
nullyblankes False. Ambos valores funcionan a nivel de campo, es decir, si queremos mantener un camponulloblank.null=Trueestablecerá el valor del campo enNULL, es decir, sin datos. Básicamente es para el valor de la columna de bases de datos.blank=Truedetermina 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=Trueblank=TrueEsto 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=Trueque sería necesario incluso en unCharFieldoTextFieldy es cuando la base de datos tiene launiquebandera 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=Truecontrario, 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