Lorsque nous ajoutons un champ de base de données dans Django, nous écrivons généralement models.CharField(max_length=100, null=True, blank=True)
. La même chose est faite avec ForeignKey
name__, DecimalField
etc. Quelle est la différence fondamentale entre avoir
null=True
seulementblank=True
seulementnull=True
, blank=True
en ce qui concerne différents champs (CharField
name__, ForeignKey
name__, ManyToManyField
name__, DateTimeField
name__). Quels sont les avantages/inconvénients de l'utilisation de 1/2/3?
null=True
définit NULL
(par rapport à NOT NULL
) dans la colonne de votre base de données. Les valeurs vierges pour les types de champs Django tels que DateTimeField
ou ForeignKey
seront stockées sous le nom NULL
dans la base de données.
blank=True
détermine si le champ sera requis dans les formulaires. Cela inclut l'administrateur et vos propres formulaires personnalisés. Si blank=True
, le champ ne sera pas obligatoire, alors que s'il s'agit de False
name__, le champ ne peut pas être vide.
La combinaison des deux est si fréquente car généralement, si vous laissez un champ vide dans votre formulaire, vous aurez également besoin de votre base de données pour autoriser les valeurs NULL
pour ce champ. L'exception est CharField
name__s et TextField
name__s, qui, dans Django, sont jamais enregistrés sous le nom NULL
name__. Les valeurs vides sont stockées dans la base de données sous forme de chaîne vide (''
).
Quelques exemples:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
Évidemment, ces deux options n’ont pas de sens logique à utiliser (cependant, il pourrait y avoir un cas d’utilisation pour null=True, blank=False
si vous voulez qu'un champ soit toujours obligatoire dans les formulaires, mais facultatif lorsque vous traitez avec un objet à travers quelque chose comme le Shell.)
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
Les types CHAR
et TEXT
ne sont jamais sauvegardés sous le nom NULL
par Django, de sorte que null=True
est inutile. Toutefois, vous pouvez définir manuellement l'un de ces champs sur None
afin de le forcer à NULL
name__. Si vous avez un scénario où cela pourrait être nécessaire, vous devez toujours inclure null=True
.
Voici comment l'ORM mappe les champs blank
& null
pour Django 1.8
class Test(models.Model):
charNull = models.CharField(max_length=10, null=True)
charBlank = models.CharField(max_length=10, blank=True)
charNullBlank = models.CharField(max_length=10, null=True, blank=True)
intNull = models.IntegerField(null=True)
intBlank = models.IntegerField(blank=True)
intNullBlank = models.IntegerField(null=True, blank=True)
dateNull = models.DateTimeField(null=True)
dateBlank = models.DateTimeField(blank=True)
dateNullBlank = models.DateTimeField(null=True, blank=True)
Les champs de base de données créés pour PostgreSQL 9.4 sont:
CREATE TABLE Test (
id serial NOT NULL,
"charNull" character varying(10),
"charBlank" character varying(10) NOT NULL,
"charNullBlank" character varying(10),
"intNull" integer,
"intBlank" integer NOT NULL,
"intNullBlank" integer,
"dateNull" timestamp with time zone,
"dateBlank" timestamp with time zone NOT NULL,
"dateNullBlank" timestamp with time zone,
CONSTRAINT Test_pkey PRIMARY KEY (id)
)
Les champs de base de données créés pour MySQL 5.6 sont:
CREATE TABLE Test (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`charNull` VARCHAR(10) NULL DEFAULT NULL,
`charBlank` VARCHAR(10) NOT NULL,
`charNullBlank` VARCHAR(10) NULL DEFAULT NULL,
`intNull` INT(11) NULL DEFAULT NULL,
`intBlank` INT(11) NOT NULL,
`intNullBlank` INT(11) NULL DEFAULT NULL,
`dateNull` DATETIME NULL DEFAULT NULL,
`dateBlank` DATETIME NOT NULL,
`dateNullBlank` DATETIME NULL DEFAULT NULL
)
Simplement null=True
définit que la base de données doit accepter les valeurs NULL
, tandis que blank=True
définit lors de la validation du formulaire, ce champ doit accepter les valeurs vides ou non (Si blank=True
il accepte le formulaire sans valeur dans ce champ et blank=False
[valeur par défaut] lors de la validation du formulaire, il affichera - Ce champ est obligatoire erreur.
null=True/False
relatif à la base de données
blank=True/False
relatif à la validation du formulaire
Lorsque vous examinez les options d'une définition de modèle Django, il est essentiel de comprendre qu'elles remplissent (au moins) deux objectifs: définir les tables de la base de données et définir le format par défaut et valider les formulaires de modèle. (Je dis "par défaut" car les valeurs peuvent toujours être remplacées en fournissant un formulaire personnalisé.) Certaines options affectent la base de données, d'autres affectent les formulaires et d'autres affectent les deux.
En ce qui concerne null
et blank
, d'autres réponses ont déjà montré que la première affecte la définition de la table de la base de données et la dernière, la validation du modèle. Je pense que la distinction peut être faite encore plus clairement en examinant les cas d'utilisation pour les quatre configurations possibles:
null=False
, blank=False
: Il s'agit de la configuration par défaut et signifie que la valeur est requise dans toutes les circonstances.
null=True
, blank=True
: Cela signifie que le champ est facultatif dans toutes les circonstances. (Comme indiqué ci-dessous, cependant, ceci n'est pas la méthode recommandée pour rendre les champs basés sur des chaînes facultatifs.)
null=False
, blank=True
: Cela signifie que le formulaire ne nécessite pas de valeur, mais que la base de données en a besoin. Il existe un certain nombre de cas d'utilisation pour cela:
L'utilisation la plus courante de cette configuration concerne les champs facultatifs basés sur des chaînes. Comme indiqué dans la documentation , l'idiome de Django consiste à utiliser la chaîne vide pour indiquer une valeur manquante. Si NULL
était également autorisé, vous auriez deux façons différentes d'indiquer une valeur manquante.
Une autre situation courante est que vous souhaitez calculer un champ automatiquement en fonction de la valeur d'un autre (dans votre méthode save()
, par exemple). Vous ne voulez pas que l'utilisateur fournisse la valeur dans un formulaire (d'où blank=True
), mais vous voulez que la base de données impose qu'une valeur est toujours fournie (null=False
).
Une autre utilisation de cette configuration est lorsque vous souhaitez indiquer qu'un ManyToManyField
est facultatif. Comme ce champ est implémenté sous forme de table distincte plutôt que de colonne de base de données, null
n'a pas de sens . La valeur de blank
continuera d’affecter les formulaires, cependant, en contrôlant si la validation aboutira ou non en l’absence de relations.
null=True
, blank=False
: Cela signifie que le formulaire nécessite une valeur, mais pas la base de données. Il s’agit peut-être de la configuration la plus rarement utilisée, mais il existe quelques cas d’utilisation:
Il est parfaitement raisonnable de demander à vos utilisateurs d'inclure toujours une valeur même si cela n'est pas réellement requis par votre logique métier. Après tout, les formulaires ne sont qu’un moyen d’ajouter et de modifier des données. Vous avez peut-être un code qui génère des données qui n'exigent pas la validation stricte que vous souhaitez exiger d'un éditeur humain.
Un autre cas d’utilisation que j’ai vu est celui où vous avez un ForeignKey
pour lequel vous ne souhaitez pas autoriser suppression en cascade . C'est-à-dire qu'en utilisation normale, la relation devrait toujours être là (blank=False
), mais si la chose sur laquelle elle pointe est supprimée, vous ne souhaitez pas que cet objet soit également supprimé. Dans ce cas, vous pouvez utiliser null=True
et on_delete=models.SET_NULL
pour implémenter un type simple de suppression logicielle .
Vous pouvez avoir votre réponse, mais jusqu'à ce jour, il est difficile de juger s'il faut mettre null = True ou vide = True ou les deux à un champ. Personnellement, j'estime qu'il est assez inutile et déroutant de proposer autant de solutions aux développeurs. Laissez le gérer les null ou les blancs comme ils le souhaitent.
Voici un exemple de champ avec blank= True
et null=True
description = models.TextField (blank = True, null = True)
Dans ce cas: blank = True
: indique à notre formulaire qu'il est correct de laisser le champ de description vide.
et
null = True
: indique à notre base de données qu'il est correct d'enregistrer une valeur nulle dans notre champ de base de données et de ne pas donner d'erreur.
null = True
Signifie qu'il n'y a pas de contrainte de base de données pour que le champ soit rempli. Vous pouvez donc avoir un objet avec la valeur null pour le rempli qui a cette option.
blank = True
Cela signifie qu'il n'y a pas de contrainte de validation dans les formulaires Django. Ainsi, lorsque vous remplissez un modelForm
pour ce modèle, vous pouvez laisser le champ avec cette option non remplie.
Voici la différence principale entre null=True
et blank=True
:
La valeur par défaut de null
et blank
est False. Ces deux valeurs fonctionnent au niveau du champ, c'est-à-dire si vous souhaitez conserver un champ null
ou blank
name__.
null=True
définira la valeur du champ sur NULL
i.e., no data. C'est fondamentalement pour la valeur de colonne des bases de données.
date = models.DateTimeField(null=True)
blank=True
détermine si le champ sera requis dans les formulaires. Cela inclut l'administrateur et vos propres formulaires personnalisés.
title = models.CharField(blank=True) // title can be kept blank.
Dans la base de données ("")
sera stocké. null=True
blank=True
Cela signifie que le champ est facultatif dans toutes les circonstances.
epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a
Lorsque nous sauvegardons quelque chose dans l'administration Django, la validation en deux étapes se produit, au niveau de Django et au niveau de la base de données. Nous ne pouvons pas enregistrer du texte dans un champ numérique.
La base de données a le type de données NULL, ce n'est rien. Lorsque Django crée des colonnes dans la base de données, il spécifie qu'elles ne peuvent pas être vides. Et si vous essayez de sauvegarder NULL, vous obtiendrez une erreur de base de données.
Également au niveau Django-Admin, tous les champs sont obligatoires par défaut, vous ne pouvez pas enregistrer les champs vides, Django vous enverra une erreur.
Donc, si vous voulez enregistrer un champ vide, vous devez l’autoriser au niveau de Django et de la base de données. blank = True - autorisera le champ vide dans le panneau d'administration. null = True - autorisera l'enregistrement de NULL dans la colonne de la base de données.
Il existe un point où null=True
serait nécessaire même sur un CharField
ou TextField
et c'est lorsque la base de données a le drapeau unique
défini pour la colonne.
En d'autres termes, si vous avez un Char/TextField unique dans Django, vous devez utiliser ceci:
models.CharField(blank=True, null=True, unique=True)
Pour CharField ou TextField non uniques, il vaut mieux ignorer le null=True
, sinon certains champs seront définis comme NULL alors que d'autres comme "" et vous devrez vérifier la valeur du champ pour NULL à chaque fois.
Je pense que vous pourriez être intéressé par enregistrez CharField vide, nullable comme null, plutôt que comme une chaîne vide . Il existe de nombreuses discussions à ce sujet et un problème très pratique que vous pouvez rencontrer (par exemple, vous souhaitez ajouter une URL openid pour chaque utilisateur, qui peut être null et doit être unique).
The default value of both null and blank is False. Both of these values work
at field level i.e., whether we want to keep a field null or blank.
null=True will set the field’s value to NULL i.e., no data. It is
basically for the databases column value.
date = models.DateTimeField(null=True)
blank=True determines whether the field will be required in forms. This
includes the admin and your own custom forms.
title = models.CharField(blank=True) // title can be kept blank. In the
database ("") will be stored.
hit upvote si vous le trouvez utile
Les valeurs par défaut de null et de blanc sont False.
Null: C'est lié à la base de données. Définit si une colonne de base de données donnée acceptera ou non les valeurs NULL.
Blanc: C'est lié à la validation. Il sera utilisé lors de la validation des formulaires, lors de l'appel de form.is_valid ().
Cela étant dit, il est parfaitement correct d'avoir un champ avec null = True et blank = False. Signification au niveau de la base de données, le champ peut être NULL, mais au niveau de l'application, il s'agit d'un champ obligatoire.
Désormais, la plupart des développeurs se trompent: Définition de null = True pour les champs basés sur des chaînes tels que CharField et TextField. Évitez de faire ça. Sinon, vous aurez deux valeurs possibles pour “pas de données”, à savoir: Aucun et une chaîne vide. Avoir deux valeurs possibles pour "pas de données" est redondant. La convention Django consiste à utiliser la chaîne vide, et non NULL.