Wenn wir ein Datenbankfeld in Django hinzufügen, schreiben wir im Allgemeinen:
models.CharField(max_length=100, null=True, blank=True)
Das gleiche wird gemacht mit ForeignKey
,DecimalField
usw. Was der grundlegende Unterschied ist , in mit
null=True
nurblank=True
nurnull=True
,blank=True
in Bezug auf verschiedene ( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
) Felder. Was sind die Vor- und Nachteile von 1/2/3?
python
django
django-models
user993563
quelle
quelle
ForeignKey
mitblank=True
, aber ohnenull=True
. Wenn das Modell gespeichert ist, möchte ich es automatisch "veröffentlichen", indem ich einen veröffentlichten Eintrag daraus erstelle. Ich kann also nichtnull
in der Datenbank speichern, da jedes Modell "veröffentlicht" werden muss, aber ich möchte das Feld in admin leer lassen können.Antworten:
null=True
setztNULL
(versusNOT NULL
) auf die Spalte in Ihrer DB. Leere Werte für Django-Feldtypen wieDateTimeField
oderForeignKey
werden wieNULL
in der Datenbank gespeichert .blank
legt fest, ob das Feld in Formularen benötigt wird. Dies umfasst den Administrator und Ihre benutzerdefinierten Formulare. Wennblank=True
dann, wird das Feld nicht benötigt, während wenn es ist, kannFalse
das Feld nicht leer sein.Die Kombination der beiden ist so häufig, dass Sie normalerweise auch Ihre Datenbank benötigen, um
NULL
Werte für dieses Feld zuzulassen , wenn Sie zulassen möchten, dass ein Feld in Ihrem Formular leer ist . Die Ausnahme sindCharField
s undTextField
s, die in Django niemals als gespeichert werdenNULL
. Leere Werte werden in der Datenbank als leere Zeichenfolge (''
) gespeichert .Einige Beispiele:
Offensichtlich sind diese beiden Optionen nicht logisch sinnvoll zu verwenden (obwohl es einen Anwendungsfall geben kann,
null=True, blank=False
wenn ein Feld immer in Formularen benötigt werden soll, optional, wenn ein Objekt über etwas wie die Shell bearbeitet wird.)CHAR
undTEXT
Typen werden nie wieNULL
von Django gespeichert ,null=True
ist also unnötig. Sie können jedoch eines dieser Felder manuell festlegenNone
, um das Festlegen als zu erzwingenNULL
. Wenn Sie ein Szenario haben, in dem dies möglicherweise erforderlich ist, sollten Sie es trotzdem einbeziehennull=True
.quelle
IntegrityError
wird ausgelöst, wenn Django versucht, den Datensatz in der Datenbank zu speichern. Das Feld muss nicht vom Benutzer ausgefüllt werden, und das ist das Problem, da es auf Datenbankebene nicht null ist.CHAR
undTEXT
NIEMALS wieNULL
von Django gespeichert werden". Es gilt für die meisten Backends, aber Oracle erzwingt eine leere Zeichenfolge auf NULL, so dass das Django Oracle-Backend eine Ausnahme von der obigen Anweisung Django DocsNone
in Python), wenn Sie null = True setzen. In den Dokumenten wird sogar gesagt, dass das Setzen von null = True vermieden werden soll, da zwei verschiedene Arten von "leeren" Werten zulässig sind. Ich habe dieses Verhalten gerade mit Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?So werden die ORM-Karten
blank
undnull
-Felder für Django 1.8 erstelltDie für PostgreSQL 9.4 erstellten Datenbankfelder sind:
Die für MySQL 5.6 erstellten Datenbankfelder sind:
quelle
blank
hat keine Auswirkung auf die Datenbank undnull
steuert, ob die DatenbankspalteNULL
Werte zulässt . Diese Antwort ist ein sehr langer Weg, dies zu sagen, und liefert keine nützlichen Informationen darüberblank
.blank
undnull
in den Datenbankspalten widergespiegelt werden sollte, obwohl tatsächlichblank
nur die Python-Behandlung und nicht die Datenbankspalten betroffen sind. Andere können frei stimmen, wenn sie es nützlich fanden; Es ist auch möglich, dass Menschen, die durch eine irreführende Antwort irregeführt werden , dies für nützlich halten.Wie in Django Model Field Referenz gesagt: Link
quelle
Es ist wichtig zu verstehen, dass die Optionen in einer Django-Modellfelddefinition (mindestens) zwei Zwecken dienen: Definieren der Datenbanktabellen und Definieren des Standardformats und der Validierung von Modellformularen. (Ich sage "Standard", da die Werte immer durch Bereitstellen eines benutzerdefinierten Formulars überschrieben werden können.) Einige Optionen wirken sich auf die Datenbank aus, einige auf Formulare und einige auf beide.
In Bezug auf
null
undblank
haben andere Antworten bereits deutlich gemacht, dass erstere die Definition der Datenbanktabelle und letztere die Modellvalidierung beeinflussen. Ich denke, die Unterscheidung kann noch deutlicher gemacht werden, wenn Anwendungsfälle für alle vier möglichen Konfigurationen betrachtet werden:null=False
,blank=False
: Dies ist die Standardkonfiguration und bedeutet, dass der Wert unter allen Umständen erforderlich ist.null=True
,blank=True
: Dies bedeutet, dass das Feld unter allen Umständen optional ist. (Wie unten erwähnt, ist dies jedoch nicht die empfohlene Methode, um stringbasierte Felder optional zu machen.)null=False
,blank=True
: Dies bedeutet, dass das Formular keinen Wert benötigt, die Datenbank jedoch. Hierfür gibt es eine Reihe von Anwendungsfällen:Die häufigste Verwendung sind optionale stringbasierte Felder. Wie in der Dokumentation angegeben , verwendet das Django-Idiom die leere Zeichenfolge, um einen fehlenden Wert anzuzeigen. Wenn dies
NULL
auch erlaubt wäre, hätten Sie zwei verschiedene Möglichkeiten, einen fehlenden Wert anzuzeigen.Eine andere häufige Situation ist, dass Sie ein Feld automatisch basierend auf dem Wert eines anderen berechnen möchten (
save()
z. B. in Ihrer Methode). Sie möchten nicht, dass der Benutzer den Wert in einem Formular bereitstellt (daherblank=True
), aber Sie möchten, dass die Datenbank erzwingt, dass immer ein Wert angegeben wird (null=False
).Eine andere Verwendung ist, wenn Sie angeben möchten, dass a
ManyToManyField
optional ist. Da dieses Feld als separate Tabelle und nicht als Datenbankspalte implementiertnull
ist , ist es bedeutungslos . Der Wert vonblank
wirkt sich jedoch weiterhin auf Formulare aus und steuert, ob die Validierung erfolgreich ist, wenn keine Beziehungen bestehen.null=True
,blank=False
: Dies bedeutet, dass für das Formular ein Wert erforderlich ist, für die Datenbank jedoch nicht. Dies ist möglicherweise die am seltensten verwendete Konfiguration, es gibt jedoch einige Anwendungsfälle dafür:Es ist durchaus sinnvoll, von Ihren Benutzern zu verlangen, dass sie immer einen Wert angeben, auch wenn dies von Ihrer Geschäftslogik nicht tatsächlich verlangt wird. Formulare sind schließlich nur eine Möglichkeit, Daten hinzuzufügen und zu bearbeiten. Möglicherweise verfügen Sie über Code, der Daten generiert, für die nicht dieselbe strenge Validierung erforderlich ist, die Sie von einem menschlichen Editor benötigen.
Ein anderer Anwendungsfall, den ich gesehen habe, ist, wenn Sie einen haben,
ForeignKey
für den Sie das Löschen von Kaskaden nicht zulassen möchten . Das heißt, im normalen Gebrauch sollte die Beziehung immer vorhanden sein (blank=False
), aber wenn das Objekt, auf das es zeigt, zufällig gelöscht wird, möchten Sie nicht, dass dieses Objekt auch gelöscht wird. In diesem Fall können Sie eine einfache Art des weichen Löschens verwendennull=True
undon_delete=models.SET_NULL
implementieren .quelle
Möglicherweise haben Sie Ihre Antwort, aber bis heute ist es schwierig zu beurteilen, ob null = True oder blank = True oder beides in ein Feld eingefügt werden soll. Ich persönlich finde es ziemlich nutzlos und verwirrend, Entwicklern so viele Optionen anzubieten. Lassen Sie die Nullen oder Leerzeichen behandeln, wie sie wollen.
Ich folge dieser Tabelle aus Two Scoops of Django :
quelle
Einfach
null=True
definiert Datenbank sollteNULL
Werte akzeptieren , andererseitsblank=True
definiert bei der Formularvalidierung, dass dieses Feld leere Werte akzeptieren soll oder nicht (Wennblank=True
es Formular ohne Wert in diesem Feld undblank=False
[Standardwert] bei der Formularvalidierung akzeptiert, wird angezeigt, dass dieses Feld ein Fehler ist.null=True/False
im Zusammenhang mit der Datenbankblank=True/False
im Zusammenhang mit der Formularvalidierungquelle
Hier ist ein Beispiel für das Feld mit
blank= True
undnull=True
description = models.TextField (leer = True, null = True)
In diesem Fall ::
blank = True
teilt unserem Formular mit, dass es in Ordnung ist, das Beschreibungsfeld leer zu lassenund
null = True
: teilt unserer Datenbank mit, dass es in Ordnung ist, einen Nullwert in unser Datenbankfeld aufzunehmen und keinen Fehler anzugeben.quelle
Dies bedeutet, dass für das zu füllende Feld keine Datenbankbeschränkung besteht. Sie können also ein Objekt mit dem Wert Null für das ausgefüllte Feld haben, das über diese Option verfügt.
Bedeutet, dass es in Django-Formen keine Einschränkung der Validierung gibt. Wenn Sie also ein
modelForm
für dieses Modell ausfüllen , können Sie das Feld mit dieser Option nicht ausfüllen .quelle
Hier ist der Hauptunterschied von
null=True
undblank=True
:Der Standardwert von beiden
null
undblank
ist False. Diese beiden Werte funktionieren auf Feldebene, dh ob wir ein Feld behalten möchtennull
oderblank
.null=True
setzt den Wert des Feldes aufNULL
dh keine Daten. Dies gilt im Wesentlichen für den Spaltenwert der Datenbank.blank=True
legt fest, ob das Feld in Formularen benötigt wird. Dies umfasst den Administrator und Ihre eigenen benutzerdefinierten Formulare.title = models.CharField(blank=True) // title can be kept blank.
In der Datenbank("")
wird gespeichert.null=True
blank=True
Dies bedeutet, dass das Feld unter allen Umständen optional ist.quelle
Die Standardwerte für null und leer sind False.
Null: Es ist datenbankbezogen. Definiert, ob eine bestimmte Datenbankspalte Nullwerte akzeptiert oder nicht.
Leer: Es ist validierungsbezogen. Es wird während der Formularüberprüfung verwendet, wenn form.is_valid () aufgerufen wird.
Davon abgesehen ist es vollkommen in Ordnung, ein Feld mit null = True und blank = False zu haben. Auf Datenbankebene kann das Feld NULL sein, auf Anwendungsebene ist es jedoch ein Pflichtfeld.
Nun, wo die meisten Entwickler etwas falsch machen: Definieren von null = True für stringbasierte Felder wie CharField und TextField. Vermeiden Sie das. Andernfalls haben Sie zwei mögliche Werte für "keine Daten", nämlich " Keine" und eine leere Zeichenfolge. Zwei mögliche Werte für "keine Daten" sind redundant. Die Django-Konvention besteht darin, die leere Zeichenfolge zu verwenden, nicht NULL.
quelle
Wenn wir etwas in Django admin speichern, erfolgt die Validierung in zwei Schritten, auf Django-Ebene und auf Datenbankebene. Wir können keinen Text in einem Zahlenfeld speichern.
Die Datenbank hat den Datentyp NULL, es ist nichts. Wenn Django Spalten in der Datenbank erstellt, wird angegeben, dass diese nicht leer sein dürfen. Und wenn Sie versuchen, NULL zu speichern, wird der Datenbankfehler angezeigt.
Auch auf Django-Admin-Ebene sind standardmäßig alle Felder erforderlich. Sie können keine leeren Felder speichern. Django gibt einen Fehler aus.
Wenn Sie also ein leeres Feld speichern möchten, müssen Sie es auf Django- und Datenbankebene zulassen. blank = True - Ermöglicht ein leeres Feld im Admin-Bereich. null = True - Ermöglicht das Speichern von NULL in der Datenbankspalte.
quelle
Es gibt einen Punkt, an dem
null=True
dies auch für einCharField
oder erforderlich wäre,TextField
und dann ist für die Datenbank dasunique
Flag für die Spalte gesetzt.Mit anderen Worten, wenn Sie ein eindeutiges Char / TextField in Django haben, müssen Sie Folgendes verwenden:
Bei nicht eindeutigem CharField oder TextField ist es besser, die
null=True
Felder zu überspringen, da sonst einige Felder als NULL festgelegt werden, während andere als "", und Sie müssen den Feldwert jedes Mal auf NULL überprüfen.quelle
null ist für die Datenbank und leer ist für die Feldvalidierung, die Sie auf einer Benutzeroberfläche wie einem Textfeld anzeigen möchten, um den Nachnamen der Person zu erhalten. Wenn lastname = models.charfield (blank = true) , wurde der Benutzer nicht aufgefordert, den Nachnamen einzugeben, da dies jetzt das optionale Feld ist. Wenn lastname = models.charfield (null = true) , bedeutet dies, dass wenn dieses Feld keinen Wert vom Benutzer erhält, es als leere Zeichenfolge "" in der Datenbank gespeichert wird.
quelle
Die Bedeutung von null = True und blank = True im Modell hängt auch davon ab, wie diese Felder in der Formularklasse definiert wurden.
Angenommen, Sie haben die folgende Klasse definiert:
Wenn die Formularklasse wie folgt definiert wurde:
Dann ist das Feld 'Name' nicht obligatorisch (aufgrund des Leerzeichens = True im Modell) und das Feld 'Adresse' ist obligatorisch (aufgrund des Leerzeichens = False im Modell).
Wenn die ClientForm-Klasse jedoch wie folgt definiert wurde:
Dann sind beide Felder ('Name' und 'Adresse') obligatorisch, "da deklarativ definierte Felder unverändert bleiben" ( https://docs.djangoproject.com/de/3.0/topics/forms/modelforms/ ). Das heißt, der Standardwert für das Attribut 'erforderlich' des Formularfelds ist True. Dazu müssen die Felder 'Name' und 'Adresse' ausgefüllt werden, auch wenn das Feld im Modell auf leer = True gesetzt wurde.
quelle
null - Standard ist False, wenn True, Django speichert leer als null in der Datenbank.
leer - Standard ist False, wenn true, darf dieses Feld leer sein
Weitere Informationen finden Sie unter https://docs.djangoproject.com/de/3.0/topics/db/models/.
quelle
Diese Tabelle zeigt die Hauptunterschiede:
quelle
In sehr einfachen Worten :
Leer ist anders als null.
null ist rein datenbankbezogen , während leer validierungsbezogen ist (im Formular erforderlich) .
Wenn
null=True
ja, wird Djangostore empty values as NULL in the database
. Wenn ein Feld vorhanden istblank=True
, wird die Formularüberprüfung durchgeführtallow entry of an empty value
. Wenn ein Feld leer = Falsch ist, wird das Feld benötigt.quelle