Kiedy dodajemy pole bazy danych w django, zwykle piszemy:
models.CharField(max_length=100, null=True, blank=True)
To samo odbywa się ForeignKey
, DecimalField
itd. Jaka jest podstawowa różnica w konieczności
null=True
tylkoblank=True
tylkonull=True
,blank=True
w odniesieniu do różnych ( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
) pól. Jakie są zalety / wady korzystania z 1/2/3?
python
django
django-models
użytkownik993563
źródło
źródło
ForeignKey
zblank=True
, ale beznull=True
. Po zapisaniu modelu chcę automatycznie „opublikować” go, tworząc z niego opublikowany wpis. Nie mogę więc zapisywaćnull
w bazie danych, ponieważ każdy model musi być „opublikowany”, ale chcę mieć możliwość pozostawienia pola pustego w panelu administratora.Odpowiedzi:
null=True
ustawiaNULL
(kontraNOT NULL
) na kolumnie w twojej bazie danych. Puste wartości dla typów pól Django, takich jakDateTimeField
lub,ForeignKey
będą przechowywane jakNULL
w DB.blank
określa, czy pole będzie wymagane w formularzach. Obejmuje to administratora i formularze niestandardowe. Jeśliblank=True
to pole nie będzie wymagane, a jeśli tak,False
to pole nie może być puste.Kombinacja tych dwóch elementów jest tak częsta, ponieważ zazwyczaj jeśli pozwolisz, aby pole było puste w formularzu, będziesz potrzebować bazy danych, aby zezwolić na
NULL
wartości dla tego pola. Wyjątkiem sąCharField
si iTextField
s, które w Django nigdy nie są zapisywane jakoNULL
. Puste wartości są przechowywane w bazie danych jako pusty ciąg (''
).Kilka przykładów:
Oczywiście te dwie opcje nie mają logicznego sensu (chociaż może istnieć przypadek użycia,
null=True, blank=False
jeśli chcesz, aby pole zawsze było wymagane w formularzach, opcjonalne, gdy zajmujesz się obiektem przez coś takiego jak powłoka).CHAR
iTEXT
typy nigdy nie są zapisywane jakNULL
przez Django, więc nienull=True
jest konieczne. Możesz jednak ręcznie ustawić jedno z tych pól,None
aby wymusić ustawienie go jakoNULL
. Jeśli masz scenariusz, w którym może to być konieczne, nadal powinieneś dołączyćnull=True
.źródło
IntegrityError
jest wywoływany, gdy Django próbuje zapisać rekord w bazie danych. To pole nie musi być wypełnione przez użytkownika, i to jest problem, ponieważ na poziomie bazy danych nie ma wartości null.CHAR
iTEXT
NIGDY nie są zapisywaneNULL
przez Django”. Jest to prawdą w przypadku większości backendów, ale Oracle wymusi pusty ciąg znaków na NULL, więc backend Django Oracle jest wyjątkiem od powyższej instrukcji Django DocsNone
Python), jeśli ustawisz null = True. W docs nawet powiedzieć, aby uniknąć ustawiania NULL = true, ponieważ pozwala to dwa różne rodzaje „Blanky” wartości. Właśnie przetestowałem to zachowanie z Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?W ten sposób mapy ORM
blank
inull
pola dla Django 1.8Pola bazy danych utworzone dla PostgreSQL 9.4 to:
Pola bazy danych utworzone dla MySQL 5.6 to:
źródło
blank
nie ma wpływu na bazę danych inull
kontroluje, czy kolumna bazy danych dopuszczaNULL
wartości. Ta odpowiedź to naprawdę długa droga do powiedzenia tego i nie zawiera żadnych użytecznych informacji na tematblank
.blank
inull
powinno być odzwierciedlone w kolumnach bazy danych, podczas gdy w rzeczywistościblank
dotyczy tylko obsługę Pythona, a nie kolumn bazy danych. Inni mogą głosować, jeśli uznają to za przydatne; ludzie wprowadzani w błąd przez mylącą odpowiedź mogą również uważać ją za przydatną.Jak powiedziano w Django Model Odniesienie do pola: Link
źródło
Ważne jest, aby zrozumieć, że opcje w definicji pola modelu Django służą (co najmniej) dwóm celom: zdefiniowaniu tabel bazy danych oraz określeniu domyślnego formatu i sprawdzania poprawności formularzy modelu. (Mówię „domyślny”, ponieważ wartości można zawsze zastąpić, podając niestandardowy formularz). 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
iblank
, inne odpowiedzi już wyjaśniły, że ta pierwsza wpływa na definicję tabeli bazy danych, a druga na sprawdzanie poprawności modelu. Myślę, że rozróżnienie można uczynić jeszcze jaśniejszym, 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 zauważono poniżej, nie jest to jednak zalecany sposób, aby pola oparte na łańcuchach były opcjonalne).null=False
,blank=True
: Oznacza to, że formularz nie wymaga wartości, ale baza danych tak. Istnieje wiele przypadków użycia tego:Najczęstszym zastosowaniem są opcjonalne pola oparte na łańcuchach. Jak zauważono w dokumentacji , idiom Django ma używać pustego ciągu, aby wskazać brakującą wartość. Gdyby
NULL
było to również dozwolone, skończyłbyś na dwóch różnych sposobach wskazania brakującej wartości.Inną częstą sytuacją jest to, że chcesz automatycznie obliczyć jedno pole na podstawie wartości innego (
save()
powiedzmy w metodzie). Nie chcesz, aby użytkownik podał wartość w formularzu (stądblank=True
), ale chcesz, aby baza danych wymusiła, że wartość jest zawsze podana (null=False
).Innym zastosowaniem jest wskazanie, że a
ManyToManyField
jest opcjonalne. Ponieważ to pole jest zaimplementowane jako osobna tabela, a nie kolumna bazy danych,null
jest bez znaczenia . Wartość parametrublank
będzie nadal wpływać na formularze, kontrolując, czy sprawdzanie poprawności zakończy się powodzeniem, gdy nie będzie ż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 istnieją dla niej pewne przypadki użycia:Całkowicie uzasadnione jest wymaganie od użytkowników, aby zawsze podawali wartość, nawet jeśli nie jest to wymagane przez logikę biznesową. W końcu formularze są tylko jednym sposobem dodawania i edytowania danych. Możliwe, że masz kod generujący dane, które nie wymagają takiej samej ścisłej weryfikacji, jakiej potrzebujesz od ludzkiego edytora.
Innym przypadkiem użycia, który widziałem, jest sytuacja, w
ForeignKey
której nie chcesz zezwalać na usuwanie kaskadowe . Oznacza to, że w normalnym użyciu relacja powinna zawsze istnieć (blank=False
), ale jeśli rzecz, którą wskazuje, zostanie usunięta, nie chcesz, aby ten obiekt również został usunięty. W takim przypadku możesz użyćnull=True
ion_delete=models.SET_NULL
zaimplementować prosty rodzaj miękkiego usuwania .źródło
Być może masz odpowiedź, ale do dziś trudno jest ocenić, czy wartość null = True, czy blank = True, czy jedno i drugie w polu. Osobiście uważam, że zapewnianie tak wielu opcji programistom jest dość bezużyteczne i mylące. Pozwól obsłużyć wartości zerowe lub puste, jak chcą.
Śledzę tę tabelę z Two Scoops of Django :
źródło
Po prostu
null=True
definiuje, że baza danych powinna akceptowaćNULL
wartości, z drugiej stronyblank=True
definiuje przy sprawdzaniu poprawności formularza, to pole powinno akceptować puste wartości lub nie (Jeśliblank=True
zaakceptuje formularz bez wartości w tym polu iblank=False
[wartość domyślna] przy sprawdzaniu poprawności formularza, pokaże to pole jest wymagane błąd.null=True/False
związane z bazą danychblank=True/False
związane z weryfikacją formularzaźródło
Oto przykład pola z
blank= True
inull=True
opis = modele. Pole tekstowe (puste = True, null = True)
W takim przypadku::
blank = True
informuje nasz formularz, że można pozostawić pole opisu pustei
null = True
: informuje naszą bazę danych, że można zapisać wartość zerową w naszym polu db i nie podawać błędu.źródło
Oto główna różnica
null=True
iblank=True
:Domyślna wartość obu
null
iblank
jest fałszywy. Obie wartości działają na poziomie pola, tj. Czy chcemy zachować pole,null
czyblank
.null=True
ustawi wartość pola naNULL
np. brak danych. Zasadniczo dotyczy to wartości kolumny baz danych.blank=True
określa, czy pole będzie wymagane w formularzach. Dotyczy to administratora i własnych formularzy niestandardowych.title = models.CharField(blank=True) // title can be kept blank.
W bazie danych("")
będą przechowywane.null=True
blank=True
Oznacza to, że pole jest opcjonalne we wszystkich okolicznościach.źródło
Oznacza to, że nie ma ograniczeń bazy danych dla pola do wypełnienia, więc możesz mieć obiekt o wartości null dla wypełnionego pola, który ma tę opcję.
Oznacza, że nie ma ograniczeń sprawdzania poprawności w formularzach django. więc po wypełnieniu formularza
modelForm
dla tego modelu możesz pozostawić pole z tą opcją niewypełnioną.źródło
Domyślne wartości null i blank to False.
Null: Jest to związane z bazą danych. Określa, czy dana kolumna bazy danych przyjmuje wartości zerowe, czy nie.
Puste: Jest to związane z walidacją. Będzie używany podczas sprawdzania poprawności formularzy, podczas wywoływania form.is_valid ().
Biorąc to pod uwagę, doskonale jest mieć pole o wartości null = True i puste = False. Znaczenie na poziomie bazy danych pole może mieć wartość NULL, ale na poziomie aplikacji jest to pole wymagane.
Teraz, gdy większość programistów myli się: Definiowanie null = True dla pól opartych na ciągach znaków, takich jak CharField i TextField. Unikaj tego. W przeciwnym razie uzyskasz dwie możliwe wartości „brak danych”, to znaczy: Brak i pusty ciąg. Posiadanie dwóch możliwych wartości „brak danych” jest zbędne. Konwencja Django polega na użyciu pustego ciągu, a nie NULL.
źródło
Kiedy zapisujemy cokolwiek w Django admin, następuje weryfikacja dwóch kroków, na poziomie Django i na poziomie bazy danych. Nie możemy zapisać tekstu w polu liczbowym.
Baza danych ma typ danych NULL, to nic. 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żna zapisać pustego pola, Django wyświetli błąd.
Tak 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 - pozwoli na zapisanie NULL w kolumnie bazy danych.
źródło
Jest jeden punkt, w którym
null=True
byłby konieczny nawet na aCharField
lubTextField
wtedy, gdy baza danych maunique
ustawioną flagę dla kolumny.Innymi słowy, jeśli masz unikalny Char / TextField w Django, musisz użyć tego:
W przypadku nieunikalnego CharField lub TextField, lepiej będzie pominąć, w
null=True
przeciwnym razie niektóre pola zostaną ustawione jako NULL, a inne jako „”, i będziesz musiał za każdym razem sprawdzać wartość pola dla NULL.źródło
null oznacza bazę danych, a puste pole służy do sprawdzania poprawności pól, które chcesz pokazać w interfejsie użytkownika, takim jak pole tekstowe, aby uzyskać nazwisko osoby. Jeśli nazwisko = models.charfield (puste = prawda), nie poprosiło użytkownika o podanie nazwiska, ponieważ jest to teraz pole opcjonalne. Jeśli nazwisko = models.charfield (null = true) , oznacza to, że jeśli to pole nie otrzyma żadnej wartości od użytkownika, to zapisze w bazie danych jako pusty ciąg „”.
źródło
Znaczenie null = True i blank = True w modelu zależy również od tego, jak te pola zostały zdefiniowane w klasie formularza.
Załóżmy, że zdefiniowałeś następującą klasę:
Jeśli klasa formularza została zdefiniowana w następujący sposób:
Wówczas pole „nazwa” nie będzie obowiązkowe (ze względu na puste = True w modelu), a pole „adres” będzie obowiązkowe (z powodu pustego = False w modelu).
Jeśli jednak klasa ClientForm została zdefiniowana w następujący sposób:
Następnie oba pola („nazwa” i „adres”) będą obowiązkowe, „ponieważ pola zdefiniowane deklaratywnie są pozostawione w niezmienionej postaci” ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) , tzn. domyślnym atrybutem „wymagana” pola formularza jest Prawda, a to wymaga wypełnienia pól „nazwa” i „adres”, nawet jeśli w modelu pole zostało ustawione na puste = Prawda.
źródło
null - wartość domyślna to False, jeśli True, Django będzie przechowywać puste jako null w bazie danych.
puste - wartość domyślna to False, jeśli true, to pole może być puste
więcej, goto https://docs.djangoproject.com/en/3.0/topics/db/models/
źródło
Poniższa tabela pokazuje główne różnice:
źródło
W bardzo prostych słowach ,
Puste jest inne niż null.
wartość null jest związana wyłącznie z bazą danych , natomiast wartość pusta dotyczy walidacji (wymagana w formie) .
Jeśli
null=True
Django to zrobistore empty values as NULL in the database
. Jeśli pole mablank=True
, sprawdzanie poprawności formularza będzieallow entry of an empty value
. Jeśli pole ma puste pole = False, pole będzie wymagane.źródło