Jaka jest różnica między null = True a blank = True w Django?
Kiedy dodajemy bazę danych pole w django zazwyczaj piszemy:
models.CharField(max_length=100, null=True, blank=True)
To samo robi się z ForeignKey
, DecimalField
itd. Jaka jest podstawowa różnica w posiadaniu
-
null=True
tylko -
blank=True
tylko -
null=True
,blank=True
W odniesieniu do różnych (CharField
, ForeignKey
, ManyToManyField
, DateTimeField
) pola. Jakie są zalety / wady korzystania z 1/2/3?
21 answers
null=True
ustawia NULL
(versus NOT NULL
) na kolumnie w DB. Puste wartości dla typów pól Django, takich jak DateTimeField
lub ForeignKey
będą przechowywane jako NULL
w DB.
blank
określa, czy pole będzie wymagane w formularzach. Obejmuje to administratora i niestandardowe formularze. Jeśli blank=True
to pole nie będzie wymagane, natomiast jeśli jest to False
Pole nie może być puste.
Kombinacja tych dwóch jest tak częsta, ponieważ zazwyczaj jeśli chcesz, aby pole było puste w Twoim formularz, będziesz również potrzebował bazy danych, aby zezwolić na wartości NULL
dla tego pola. Wyjątkiem są CharField
s I TextField
s, które w Django są nigdy zapisywane jako NULL
. Puste wartości są przechowywane w DB jako pusty łańcuch (''
).
Kilka przykładów:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
Oczywiście, te dwie opcje nie mają logicznego sensu używać (chociaż może istnieć przypadek użycia dla {[16] } jeśli chcesz, aby pole było zawsze wymagane w formularzach, opcjonalne podczas czynienia z obiektem poprzez coś jak skorupa.)
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
CHAR
i TEXT
typy nigdy nie są zapisywane jako NULL
przez Django, więc {[2] } jest niepotrzebne. Można jednak ręcznie ustawić jedno z tych pól na None
, aby wymusić ustawienie go jako NULL
. Jeśli masz scenariusz, w którym może to być konieczne, powinieneś jeszcze dołączyć null=True
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-10 10:01:58
Tak mapy ORM blank
& null
pola dla 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)
Pola bazy danych utworzone dla PostgreSQL 9.4 to:
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)
)
Pola bazy danych utworzone dla MySQL 5.6 to:
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
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 09:20:38
Ważne jest, aby zrozumieć, że opcje w definicji pola Modelu Django służą (co najmniej) dwóm celom: definiowaniu tabel bazy danych oraz definiowaniu domyślnego formatu i walidacji formularzy modelu. (Mówię "domyślne", ponieważ wartości zawsze mogą być nadpisane przez podanie niestandardowego formularza.) Niektóre opcje wpływają na bazę danych, niektóre opcje wpływają na formularze, a niektóre na oba.
Jeśli chodzi o null
i blank
, Inne odpowiedzi już wyjaśniły, że pierwsza dotyczy definicja tabeli bazy danych i ta ostatnia wpływa na walidację modelu. Myślę, że rozróżnienie może być jeszcze jaśniejsze, patrząc na przypadki użycia dla wszystkich czterech możliwych konfiguracji: {]}
null=False
,blank=False
: jest to konfiguracja domyślna i oznacza, że wartość jest wymagana we wszystkich okolicznościach.null=True
,blank=True
: oznacza to, że pole jest opcjonalne we wszystkich okolicznościach. (Jak zaznaczono poniżej, jest to , a nie zalecany sposób tworzenia ciągów pola opcjonalne.)-
null=False
,blank=True
: oznacza to, że Formularz nie wymaga wartości, ale baza danych. Istnieje wiele przypadków użycia dla tego:Najczęściej używa się opcjonalnych pól opartych na łańcuchach. Jak zauważono w dokumentacji, idiom Django polega na użyciu pustego ciągu znaków do wskazania brakującej wartości. Jeśli
NULL
byłoby również dozwolone, otrzymałbyś dwa różne sposoby wskazania brakującej wartości.Inny często zdarza się, że chcesz obliczyć jedno pole Automatycznie na podstawie wartości innego (np. w metodzie
save()
). Nie chcesz, aby użytkownik podawał wartość w formie (stądblank=True
), ale chcesz, aby baza danych wymuszała, aby wartość była zawsze podawana (null=False
).Innym zastosowaniem jest wskazanie, że {[12] } jest opcjonalne. Ponieważ to pole jest zaimplementowane jako oddzielna tabela, a nie kolumna bazy danych,
null
jest bez znaczenia . Na wartośćblank
nadal będzie miała wpływ na formularze, kontrolując, czy Walidacja zakończy się sukcesem, gdy nie ma żadnych relacji.
-
null=True
,blank=False
: oznacza to, że formularz wymaga wartości, ale baza danych nie. może to być najczęściej używana konfiguracja, ale są dla niej pewne przypadki użycia:Jest to całkowicie rozsądne, aby wymagać od użytkowników, aby zawsze uwzględniali wartość, nawet jeśli nie jest to rzeczywiście wymagane przez logikę biznesową. W końcu formularze są tylko jednym ze sposobów dodawania i edycji danych. Możesz mieć kod, który generuje dane, które nie wymagają tej samej rygorystycznej walidacji, jakiej chcesz wymagać od ludzkiego edytora.
Innym przypadkiem użycia, który widziałem, jest gdy masz
ForeignKey
, dla którego nie chcesz zezwolić kaskadowe usuwanie . Oznacza to, że w normalnym użyciu relacja powinna być zawsze (blank=False
), ale jeśli coś, na co wskazuje, zostanie usunięte, nie chcesz, aby ten obiekt był usunięte. W takim przypadku możesz użyćnull=True
ion_delete=models.SET_NULL
do zaimplementowania prostego rodzaju miękkiego usuwania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-28 10:37:29
Jak napisano w polu modelu Django Referencja: Link
Opcje pola
następujące argumenty są dostępne dla wszystkich typów pól. Wszystkie są opcjonalne.
null
Field.null
JeśliTrue
, Django zapisze puste wartości jakoNULL
w bazie danych. Wartość domyślna toFalse
.Unikaj używania
null
Na polach opartych na łańcuchach, takich jakCharField
iTextField
ponieważ puste wartości łańcuchowe będą zawsze zapisywane jako pusty struny, nie jakoNULL
. Jeśli pole oparte na łańcuchu manull=True
, to oznacza, że ma dwie możliwe wartości dla "brak danych":NULL
, oraz pustą sznurek. W większości przypadków zbędne jest posiadanie dwóch możliwych wartości dla "brak danych"; Konwencja Django polega na używaniu pustego łańcucha, a nieNULL
.Zarówno dla pól opartych na łańcuchach, jak i nie opartych na łańcuchach, będziesz również potrzebować aby ustawić
blank=True
jeśli chcesz zezwolić na puste wartości w formularzach, jako parametrnull
wpływa tylko na przechowywanie bazy danych (zobaczblank
).Uwaga
Podczas korzystania z zaplecza bazy danych Oracle, wartość NULL będzie przechowywana w celu oznaczenia pustego ciągu znaków niezależnie od tego atrybutu
blank
Field.blank
Jeśli
True
, pole może być puste. Wartość domyślna toFalse
.Zauważ, że to coś innego niż
null
.null
jest czysto związane z bazą danych, podczas gdy {[14] } jest związane z walidacją. Jeśli pole hasblank=True
, Walidacja formularza pozwoli na wprowadzenie pustej wartości. Jeśli pole mablank=False
, pole będzie wymagane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-28 10:17:38
Możesz mieć swoją odpowiedź, jednak do dziś trudno jest ocenić, czy umieścić null = True, blank=True,czy oba pola. Osobiście uważam, że jest to dość bezużyteczne i mylące, aby zapewnić tak wiele opcji dla programistów. Niech sobie radzą z nullami lub blankami, jak chcą.
Podążam za tą tabelą, od dwie miarki Django:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-18 21:42:28
Po prostu null=True
definiuje bazę danych powinna przyjmować wartości NULL
, z drugiej strony blank=True
definiuje przy walidacji formularza To pole powinno przyjmować puste wartości lub nie(Jeśli blank=True
akceptuje formularz bez wartości w tym polu i blank=False
[Wartość domyślna] przy walidacji formularza pokaże to pole jest wymagane błąd.
null=True/False
powiązane z bazą danych
blank=True/False
powiązane z walidacją formularza
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 04:26:15
Oto przykład pola z blank= True
i null=True
Description = models.TextField (blank=True, null= True)
W tym przypadku:
blank = True
: informuje nasz formularz, że Pole opisu jest w porządku pozostawić puste
I
null = True
: mówi naszej bazie danych, że zapisanie wartości null w naszym polu db jest w porządku i nie powoduje błędu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 16:41:29
Jeśli ustawisz null=True
, pozwoli to ustawić wartość kolumny bazy danych jako NULL
. Jeśli ustawisz tylko blank=True
, django ustawi domyślną nową wartość dla kolumny równą ""
.
Jest jeden punkt, w którym null=True
będzie konieczne nawet na CharField
lub TextField
i wtedy baza danych ma unique
flaga ustawiona dla kolumny. W tym przypadku musisz użyć tego:
a_unique_string = models.CharField(blank=True, null=True, unique=True)
Preferencyjnie pomiń null=True
dla nie unikalny CharField
lub TextField
. W przeciwnym razie niektóre pola będą ustawione jako NULL
, podczas gdy inne jako ""
, i będziesz musiał sprawdzić wartość pola dla NULL
za każdym razem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-08 15:12:18
Domyślne wartości null i blank są False.
Null: jest to związane z bazą danych. Określa, czy dana kolumna bazy danych będzie akceptować wartości null, czy nie.
Blank: jest to związane z walidacją. Będzie on używany podczas walidacji formularzy, podczas wywoływania form. is_valid ().
To powiedziawszy, jest całkowicie w porządku mieć pole z null = True i blank=False. Czyli na poziomie bazy danych pole może być NULL, ale na poziomie aplikacji jest wymagane.
Teraz, gdzie większość programistów się myli: Definiowanie null = True dla pól typu string, takich jak CharField i TextField. Unikaj tego. W przeciwnym razie będziesz mieć dwie możliwe wartości dla "brak danych", to znaczy: None i pusty łańcuch znaków. Posiadanie dwóch możliwych wartości dla "brak danych" jest zbędne. Konwencja Django polega na używaniu pustego łańcucha, a nie NULL.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-29 05:35:33
null = True
Oznacza, że nie ma ograniczeń bazy danych dla wypełnianego pola, więc możesz mieć obiekt z wartością null dla wypełnionego, który ma tę opcję.
blank = True
Oznacza, że nie ma ograniczeń walidacji w formularzach django. więc po wypełnieniu modelForm
dla tego modelu możesz pozostawić pole z tą opcją niewypełnione.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 05:15:31
Oto główna różnica null=True
i blank=True
:
Domyślną wartością zarówno null
jak i blank
jest False. Obie te wartości działają na poziomie pola, tzn. niezależnie od tego, czy chcemy zachować pole null
czy blank
.
null=True
ustawi wartość pola na NULL
, tzn. brak danych. Jest to w zasadzie wartość kolumny bazy danych.
date = models.DateTimeField(null=True)
blank=True
określa, czy pole będzie wymagane w formularzach. Obejmuje to administratora i własne formularze niestandardowe.
title = models.CharField(blank=True) // title can be kept blank.
W baza danych ("")
będzie przechowywana.
null=True
blank=True
oznacza to, że pole jest opcjonalne we wszystkich okolicznościach.
epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 07:39:35
Kiedy zapisujemy cokolwiek w Django admin odbywa się Walidacja w dwóch krokach, na poziomie Django i na poziomie bazy danych. Nie możemy zapisać tekstu w polu Numer.
Baza danych ma typ danych NULL, to nic takiego. Kiedy Django tworzy kolumny w bazie danych, Określa, że nie mogą być puste. A jeśli spróbujesz zapisać NULL, otrzymasz błąd bazy danych.
Również na poziomie Django-Admin, wszystkie pola są domyślnie wymagane, nie możesz zapisać pustego pola, Django rzuci Ci błąd.
Więc, jeśli chcesz zapisać puste pole, musisz zezwolić na to na poziomie Django i bazy danych. blank = True - pozwoli na puste pole w panelu administracyjnym null = True-umożliwi zapisanie NULL do kolumny bazy danych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-11 23:58:59
Null {[2] } jest dla bazy danych i puste jest dla walidacji pól, które chcesz pokazać w interfejsie użytkownika, takim jak textfield, aby uzyskać nazwisko osoby. If lastname = models.charfield (blank=true) nie poprosiło użytkownika o podanie nazwiska, ponieważ jest to teraz opcjonalne pole. If lastname = models.charfield (null=true) to oznacza, że jeśli to pole nie otrzyma żadnej wartości od użytkownika, to zostanie zapisane w bazie danych jako pusty łańcuch"".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-18 06:47:37
Null jest czysto związane z bazą danych, podczas gdy puste jest związane z walidacją. Jeśli pole ma blank = True, Walidacja na stronie Administratora Django pozwoli na wprowadzenie pustej wartości. Jeśli pole ma blank=False, pole będzie wymagane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-02 07:39:42
W bardzo prostych słowach ,
Puste jest INNE niż null.
Null jest czysto związane z bazą danych, podczas gdy puste jest związane z walidacją (wymagane w formie) .
If null=True
, Django będzie store empty values as NULL in the database
. Jeśli pole ma blank=True
, Walidacja formularza będzie allow entry of an empty value
. Jeśli pole ma blank = False, pole będzie wymagane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-09 09:49:21
Prosta odpowiedź brzmiałaby: Null jest dla tabel bazy danych, podczas gdy Blank jest dla form Django.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-22 15:17:45
Null-default is False jeśli prawda, Django będzie przechowywać puste jako null w bazie danych.
Blank-default is False jeśli true to pole może być puste
Więcej, goto https://docs.djangoproject.com/en/3.0/topics/db/models/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-02 09:38:34
Poniższa tabela pokazuje główne różnice:
+--------------------------------------------------------------------+
| Purpose | null=True | blank = True |
|--------------------------|------------------|----------------------|
| Field can be empty in DB | Do this | Unaffected |
|--------------------------|------------------|----------------------|
| ModelForm(required field)| Unaffected | field not required |
|--------------------------|------------------|----------------------|
| Form Validation | Unaffected | field not required |
|--------------------------|------------------|----------------------|
| on_delete=SET_NULL | Need this | Unaffected |
+--------------------------------------------------------------------+
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-26 09:17:51
Znaczenie null = True i blank = True w modelu zależy również od tego, jak te pola zostały zdefiniowane w klasie form.
Załóżmy, że zdefiniowałeś następującą klasę:
class Client (models.Model):
name = models.CharField (max_length=100, blank=True)
address = models.CharField (max_length=100, blank=False)
Jeśli Klasa form została zdefiniowana w następujący sposób:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
widgets = {
'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
}
Wtedy pole "nazwa" nie będzie obowiązkowe (ze względu na blank=True w modelu), a pole "Adres" będzie obowiązkowe (ze względu na blank=False w modelu).
Jednakże, jeśli Klasa ClientForm została zdefiniowana tak:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
name = forms.CharField (
widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
)
address = forms.CharField (
widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
)
Wtedy oba pola ('Nazwa' i 'adres') będą obowiązkowe, "ponieważ pola zdefiniowane deklaratywnie są pozostawione jako-is" (https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/), tzn. domyślnym atrybutem "required" pola formularza jest True, co wymaga wypełnienia pól "name" I "address", nawet jeśli w modelu pole zostało ustawione na blank=True.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-29 16:00:09
Gdy ustawisz null=true
, ustawi null
w Twojej bazie danych, jeśli pole nie jest wypełnione. Jeśli
ustawiasz blank='true
, że nie będzie ustawiać żadnej wartości do pola.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-08 11:16:28
Blank=False # this field is required.
Null=False # this field should not be null
Blank=True # this field is optional.
Null=True # Django uses empty string (''), not NULL.
Uwaga:
Unikaj używania null=True
na polach opartych na łańcuchach znaków, takich jak CharField
i TextField
oraz FileField
/ImageField
.
Ref: Django null , Django blank
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-27 11:43:57