Jaka jest różnica między null = True a blank = True w Django?

chcesz poprawić ten post? podaj szczegółowe odpowiedzi na to pytanie, w tym cytaty i wyjaśnienie, dlaczego Twoja odpowiedź jest prawidłowa. Odpowiedzi bez wystarczającej ilości szczegółów mogą być edytowane lub usuwane.

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

  1. null=True tylko
  2. blank=True tylko
  3. null=True, blank=True

W odniesieniu do różnych (CharField, ForeignKey, ManyToManyField, DateTimeField) pola. Jakie są zalety / wady korzystania z 1/2/3?

Author: ivanleoncz, 2011-12-22

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.

 1212
Author: Chris Pratt,
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
)
 134
Author: user,
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ąd blank=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 i on_delete=models.SET_NULL do zaimplementowania prostego rodzaju miękkiego usuwania.

 71
Author: Kevin Christopher Henry,
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śli True, Django zapisze puste wartości jako NULL w bazie danych. Wartość domyślna to False.

Unikaj używania null Na polach opartych na łańcuchach, takich jak CharField i TextField ponieważ puste wartości łańcuchowe będą zawsze zapisywane jako pusty struny, nie jako NULL. Jeśli pole oparte na łańcuchu ma null=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 nie NULL.

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 parametr null wpływa tylko na przechowywanie bazy danych (zobacz blank).

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 to False.

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 has blank=True, Walidacja formularza pozwoli na wprowadzenie pustej wartości. Jeśli pole ma blank=False, pole będzie wymagane.

 51
Author: DiogoLR,
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: Tutaj wpisz opis obrazka

Tabela pokazująca, kiedy używać null lub blank dla każdego typu pola

 37
Author: saran3h,
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

 27
Author: Ranju R,
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.

 12
Author: Stryker,
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.

 9
Author: Nitin Nain,
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.

 8
Author: sharif_42,
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.

 7
Author: Milad Khodabandehloo,
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
 7
Author: Sonia Rani,
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.

 5
Author: Yuriy Kots,
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"".

 4
Author: Tabish,
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

 3
Author: Vivek,
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.

 2
Author: Yash,
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.

 2
Author: Shedrack,
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/

 1
Author: vansh bhardwaj,
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           |
+--------------------------------------------------------------------+
 1
Author: lavee_singh,
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.

 1
Author: Carlos Ribeiro,
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.

 0
Author: Jesvin Vijesh S,
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

 0
Author: Siva Sankar,
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