différencier null=True, vide=True dans django
Lorsque nous ajoutons un champ de base de données dans django nous écrivent généralement models.CharField(max_length=100, null=True, blank=True)
. De la même manière avec ForeignKey
, DecimalField
etc. Quelle est la principale différence réside dans le fait d'avoir
null=True
seulementblank=True
seulementnull=True
,blank=True
à l'égard des différentes (CharField
, ForeignKey
, ManyToManyField
, DateTimeField
) champs. Quels sont les avantages/inconvénients de l'utilisation de 1/2/3?
- Vous avez beau réponses à ce sujet ici: stackoverflow.com/questions/8159310/... et ici: stackoverflow.com/questions/4384098/...
- Bonne lecture: b-list.org/weblog/2006/jun/28/...
- Oui, j'ai aussi ce cas d'utilisation avec
ForeignKey
avecblank=True
, mais sansnull=True
. Lorsque le modèle est enregistré, je veux automatiquement "publier" par la création d'un texte publié en sortir. Je ne peux donc pas enregistrernull
à la base de données, comme chaque modèle doit être "publié", mais je veux être en mesure de laisser le champ vide dans l'admin.
Vous devez vous connecter pour publier un commentaire.
null=True
jeux deNULL
(par rapport àNOT NULL
) sur la colonne dans votre base de données. Les valeurs vides pour Django types de champs tels queDateTimeField
ouForeignKey
sera stocké commeNULL
dans la DB.blank=True
détermine si le champ est obligatoire dans les formulaires. Cela comprend l'admin et vos propres formulaires personnalisés. Siblank=True
le champ ne sera pas nécessaire, alors que si c'estFalse
le champ ne peut pas être vide.Le combo des deux est tellement fréquente parce que en général, si vous allez permettre à un champ vierge dans votre formulaire, vous allez aussi avoir besoin de votre base de données pour permettre
NULL
valeurs pour ce champ. L'exception estCharField
s etTextField
s, qui dans Django sont jamais enregistré commeNULL
. Les valeurs vides sont stockés dans la base de données comme une chaîne vide (''
).Quelques exemples:
Évidemment, ces deux options ne font pas sens logique à utiliser (bien que, il pourrait être un cas d'utilisation pour
null=True, blank=False
si vous voulez un champ de toujours être nécessaire dans les formes, mais en option lors de l'affaire à un objet par le biais de quelque chose comme la coquille).CHAR
etTEXT
types ne sont jamais enregistrés commeNULL
par Django, doncnull=True
est inutile. Toutefois, vous pouvez définir manuellement l'un de ces champs pourNone
à force de le définir commeNULL
. Si vous avez un scénario où cela pourrait être nécessaire, vous devez aussi inclurenull=True
.IntegrityError
est déclenché lorsque Django tente de sauvegarder l'enregistrement dans la base de données. Le champ n'est pas nécessaire pour être rempli par l'utilisateur, et c'est le problème, car au niveau base de données, il n'est pas null.blank=True
pour un champ de saisie par le système.CHAR
etTEXT
ne sont JAMAIS enregistrés commeNULL
par Django". C'est vrai pour la plupart des serveurs d'arrière-plan, mais Oracle de la force d'une chaîne vide à NULL, le Django Oracle backend est une exception à la déclaration ci-dessus Django DocsNone
en Python) si vous définissez la valeur null=True. Le docs même dire pour éviter de mettre null=True, car il permet deux types de "blanky a" des valeurs. Je viens de tester ce comportement avec Django 1.8/MySQL 5.6blank=True
,null=False
,default="something"
?C'est comment l'ORM cartes
blank
&null
champs pour Django 1.8Les champs de base de données créé pour PostgreSQL 9.4 sont :
Les champs de base de données créé pour MySQL 5.6 sont :
blank
n'a aucun effet sur la base de données, etnull
contrôle si la colonne de base de données permetNULL
valeurs. Cette réponse est d'une très longue façon de dire que, et de ne pas fournir toute information utile surblank
.blank
etnull
devraient être reflétées dans les colonnes de base de données, alors qu'en fait,blank
affecte uniquement Python de manipulation, pas de colonnes de base de données. Les autres sont libres de upvote si ils l'ont trouvé utile; il est également possible pour les gens qui sont trompés par une fausse réponse àComme dit dans Django Champ de Modèle de référence: Lien
Il est crucial de comprendre que les options dans un Django modèle de définition du champ de servir (au moins) deux objectifs: définir les tables de base de données, et de définir le format par défaut et la validation des modèles de formulaires. (Je dis "par défaut", parce que les valeurs peuvent toujours être remplacées par la fourniture d'un formulaire personnalisé.) Certains incidence sur les options de la base de données, certaines options affectent les formes, et certains touchent à la fois.
Quand il s'agit de
null
etblank
, d'autres réponses ont déjà fait savoir que l'ancien affecte la base de données de définition de la table et celui-ci affecte la validation du modèle. Je pense que la distinction peut être encore plus clair en regardant des cas d'utilisation pour tous les quatre configurations possibles:null=False
,blank=False
: C'est 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, si, c'est pas la méthode recommandée pour effectuer la chaîne des champs facultatifs).null=False
,blank=True
: Cela signifie que la forme ne nécessite pas une valeur, mais la base de données. Il y a un certain nombre de cas d'utilisation pour ce:L'utilisation la plus courante est facultatif chaîne des champs. Comme indiqué dans la documentation, le Django idiome est d'utiliser la chaîne vide pour indiquer une valeur manquante. Si
NULL
a également permis vous vous retrouvez avec deux méthodes différentes pour indiquer une valeur manquante.Une autre commune de la situation, c'est que vous voulez calculer un champ automatiquement sur la base de la valeur de l'autre (dans votre
save()
méthode, par exemple). Vous ne voulez pas que l'utilisateur de fournir la valeur dans un formulaire (doncblank=True
), mais vous ne voulez que la base de données pour appliquer qu'une valeur est toujours fourni (null=False
).Une autre utilisation, c'est quand vous voulez indiquer qu'une
ManyToManyField
est facultatif. Car ce champ est mis en œuvre comme un tableau distinct plutôt qu'une colonne de base de données,null
est vide de sens. La valeur deblank
affecte toujours les formes, bien que, de contrôler si oui ou non validation de la réussite quand il n'y a pas de relations.null=True
,blank=False
: Cela signifie que le formulaire exige une valeur, mais la base de données ne fonctionne pas. Cela peut être le plus rarement utilisé de la configuration, mais il existe des cas d'utilisation pour elle:Il est parfaitement raisonnable de demander à vos utilisateurs de toujours inclure une valeur, même si elle n'est pas réellement requis par votre logique métier. Après tout, les formes ne sont qu'un moyen de l'ajout et l'édition de données. Vous pouvez avoir le code qui génère des données qui n'a pas besoin de la même rigueur de validation que vous souhaitez exiger d'un homme de l'éditeur.
Un autre cas d'utilisation que j'ai vu, c'est quand vous avez un
ForeignKey
pour lesquels vous ne souhaitez pas autoriser en cascade la suppression. C'est, en utilisation normale, la relation doit toujours être là (blank=False
), mais si la chose il souligne arrive à être supprimé, vous ne voulez pas que cet objet d'être supprimés aussi. Dans ce cas, vous pouvez utilisernull=True
eton_delete=models.SET_NULL
à mettre en œuvre un simple genre de suppression logicielle.Simplement
null=True
définit la base de données doit accepterNULL
valeurs, sur l'autre mainblank=True
définit sur la validation du formulaire, ce champ doit accepter des valeurs vides ou pas(Siblank=True
il accepte le formulaire sans une valeur dans ce champ etblank=False
[valeur par défaut] sur la validation du formulaire, il va montrer Ce champ est requis erreur.null=True/False
liées à la base de donnéesblank=True/False
liées à la validation d'un formulaireVous pouvez avoir votre réponse cependant jusqu'à ce jour il est difficile de juger de la possibilité de mettre null=True ou vide=True ou les deux, pour un champ. Personnellement, je pense que c'est assez inutile et source de confusion pour offrir de nombreuses options pour les développeurs. Laissez la gérer la nuls ou blancs mais ils veulent.
J'ai suivi ce tableau:
Voici un exemple du champ avec
blank= True
etnull=True
description = les modèles.TextField(vide=True, null= True)
Dans ce cas:
blank = True
: raconte notre formulaire qu'il est ok pour quitter le champ de description videet
null = True
: raconte notre base de données qu'il est ok pour enregistrer une valeur null dans notre champ db et ne pas donner une erreur.Je pense que vous pouvez être intéressé par
Enregistrer vide, nullable CharField est comme null plutôt que comme une chaîne vide. Il y a beaucoup de discussions à ce sujet, et un problème très concret que vous pouvez rencontrer (par exemple. vous souhaitez ajouter un openid url pour chaque utilisateur qui peut être null et doit être unique).
N'y a pas de contrainte de base de données pour le champ à remplir, de sorte que vous pouvez avoir un objet avec la valeur null pour le qui a cette option.
N'y a pas de contrainte de validation dans django formes. ainsi, lorsque vous remplissez un
modelForm
pour ce modèle, vous pouvez laisser le champ avec cette option vacants.Ici, est la principale différence de
null=True
etblank=True
:La valeur par défaut de deux
null
etblank
est Faux. Ces deux valeurs de travail sur le terrain, c'est à dire, si nous voulons garder un champnull
oublank
.null=True
sera de définir la valeur du champ àNULL
c'est à dire, pas de données. C'est fondamentalement pour les bases de données de la valeur de la colonne.blank=True
détermine si le champ est obligatoire dans les formulaires. Cela comprend l'admin et vos propres formulaires personnalisés.title = models.CharField(blank=True) //title can be kept blank.
Dans la base de données
("")
seront stockées.null=True
blank=True
Cela signifie que le champ est facultatif dans toutes les circonstances.Lorsque nous sauver quoi que ce soit dans Django admin deux étapes de validation qui se passe, sur Django niveau de et sur niveau de Base de données. Nous ne pouvons pas enregistrer du texte dans un champ de numéro.
Base de données contient des données de type NULL, ce n'est rien. Lorsque Django crée des colonnes dans la base de données indique qu'ils ne peuvent pas être vide. Et si vous essayez d'enregistrer NULL, vous obtiendrez l'erreur de base de données.
Également sur Django-Admin, tous les champs sont requis par défaut, vous ne pouvez pas enregistrer champ vide, Django va vous jeter une erreur.
Donc, si vous souhaitez enregistrer champ vide vous avez besoin de l'autoriser sur Django et le niveau de Base de données.
vide=True - permettra champ vide dans le panneau admin
null=True, permettront de sauver la valeur NULL à la colonne de base de données.
Il y a un point où
null=True
serait nécessaire, même sur unCharField
ouTextField
et c'est lorsque la base de données a launique
drapeau de la colonne.En d'autres termes, si vous avez un unique Char/TextField dans Django, vous aurez besoin d'utiliser cette:
Pour non-unique CharField ou TextField, vous serez mieux en sautant le
null=True
sinon certains champs aurez défini comme NULL alors que d'autres comme "" , et vous aurez à vérifier la valeur du champ pour la valeur NULL à chaque fois.Les valeurs par défaut de nul et vierge sont Fausses.
Nul: Il est lié aux bases de données. Définit si une base de données de la colonne accepte les valeurs null ou pas.
Vide: C'est la validation liés. Il sera utilisé lors de la validation des formulaires, lors de l'appel de la forme.is_valid().
Cela étant dit, il est parfaitement bien pour avoir un champ avec la valeur null=True et vide=False. Signification sur la base de données au niveau du champ peut être NULLE, mais au niveau de l'application, il est un champ obligatoire.
Aujourd'hui, où la plupart des développeurs se tromper: la Définition de la valeur null=True pour une chaîne basée sur des domaines tels que CharField et TextField. Éviter de le faire. Sinon, vous finirez par avoir deux valeurs possibles pour “pas de données”, c'est: Aucun et une chaîne vide. Avoir deux valeurs possibles pour “pas de données” est redondante. Le Django convention est d'utiliser la chaîne vide, pas NULL.
NULL == TRUE
pour VIDE == TRUE
frappé upvote si vous le trouvez utile
null pour la base de données et vide est pour les champs de validation que vous souhaitez afficher sur l'interface utilisateur comme textfield pour obtenir le nom de famille de la personne.
Si lastname=modèles.charfield (vide=true) il didnot demander à l'utilisateur d'entrer nom de famille comme c'est le champ facultatif maintenant.
Si lastname=modèles.charfield (null=true) cela signifie que si ce champ n'est pas d'obtenir n'importe quelle valeur de l'utilisateur, puis il va stocker dans la base de données comme une chaîne vide " ".