python - many - django tutorial
différencier null=True, vide=True dans django (6)
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
, DecimalField
etc. Quelle est la différence fondamentale en ayant
-
null=True
seulement -
blank=True
seulement -
null=True
,blank=True
en ce qui concerne différents CharField
( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
). Quels sont les avantages / inconvénients de l'utilisation de 1/2/3?
Comme dit dans Django Model Field référence: Link
Options de champ
Les arguments suivants sont disponibles pour tous les types de champs. Tous sont optionnels.
null
Field.null
Si True
, Django va stocker les valeurs vides comme NULL
dans la base de données. La valeur par défaut est False
.
Évitez d'utiliser null
sur les champs basés sur des chaînes tels que CharField
et TextField
car les valeurs de chaînes vides seront toujours stockées comme des chaînes vides, pas comme NULL
. Si un champ basé sur une chaîne a null=True
, cela signifie qu'il a deux valeurs possibles pour "aucune donnée": NULL
, et la chaîne vide. Dans la plupart des cas, il est redondant d'avoir deux valeurs possibles pour "pas de données"; la convention de Django est d'utiliser la chaîne vide, pas NULL
.
Pour les champs basés sur des chaînes et non sur des chaînes, vous devrez également définir blank=True
si vous souhaitez autoriser des valeurs vides dans les formulaires, car le paramètre null
n'affecte que le stockage de la base de données (voir blank
).
Remarque
Lors de l'utilisation du backend de base de données Oracle, la valeur NULL sera stockée pour indiquer la chaîne vide indépendamment de cet attribut
blank
Field.blank
Si la valeur est True
, le champ est autorisé à être vide. La valeur par défaut est False
.
Notez que ceci est différent de null
. null
est purement lié à la base de données, tandis que le blank
est lié à la validation. Si un champ a la valeur blank=True
, la validation du formulaire autorisera l'entrée d'une valeur vide. Si un champ est blank=False
, le champ sera requis.
Je pense que vous pouvez être intéressé par Enregistrer vide, nullable CharField comme nulle plutôt que comme une chaîne vide . Il y a beaucoup de discussions à ce sujet, et un problème très pratique que vous pouvez rencontrer (par exemple, vous voulez ajouter une url openid pour chaque utilisateur qui peut être nul et devrait être unique).
Quand on sauvegarde quelque chose dans l'admin Django, deux étapes de validation se passent, au niveau Django et au niveau de la base de données. Nous ne pouvons pas enregistrer de 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 d'enregistrer NULL, vous obtiendrez l'erreur de base de données.
Aussi au niveau Django-Admin, tous les champs sont obligatoires par défaut, vous ne pouvez pas sauvegarder le champ vide, 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 - permettra d'enregistrer NULL dans la colonne de la base de données.
Simply null=True
définit la base de données devrait accepter les valeurs NULL
, d'autre part blank=True
définit à la validation du formulaire ce champ devrait accepter les valeurs vides ou non (Si blank=True
, accepter le formulaire sans valeur dans ce champ et blank=False
] sur la validation du formulaire, il montrera Ce champ est requis erreur.
null=True/False
lié à la base de données
blank=True/False
lié à la validation du formulaire
Voici un exemple du champ avec blank = true et null = true description = models.TextField (vide = 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 db et de ne pas donner d'erreur.
null
est pour la valeur de la colonne DataBase
null=True
définit NULL
(contre NOT NULL
) sur la colonne de votre base de données. Les valeurs vides pour les types de champs Django tels que DateTimeField
ou ForeignKey
seront stockées en tant que NULL
dans la base de données.
blank
est pour l'exigence de champ dans les formes
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
alors le champ ne sera pas requis, alors que s'il est False
le champ ne peut pas être vide.
La combinaison des deux est si fréquente, car si vous autorisez un champ à être vide dans votre formulaire, vous aurez également besoin de votre base de données pour autoriser les valeurs NULL
pour ce champ. Les exceptions sont CharField
et TextField
, qui dans Django ne sont jamais enregistrés comme NULL
. Les valeurs vides sont stockées dans le DB sous la forme d'une 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 peut y avoir un cas d'utilisation pour null=True, blank=False
si vous voulez qu'un champ soit toujours requis dans les formulaires, mais optionnel quand vous traitez un objet par quelque chose comme la coquille.)
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
CHAR
types CHAR
et TEXT
ne sont jamais enregistrés comme NULL
par Django, donc null=True
est inutile. Toutefois, vous pouvez définir manuellement l'un de ces champs sur None
pour forcer la NULL
. Si vous avez un scénario où cela pourrait être nécessaire, vous devez toujours inclure null=True
.