Skirti null = True, blank = True in django

Kai pridedame duomenų bazės lauką į django, paprastai rašome models.CharField(max_length=100, null=True, blank=True) . Tai daroma su „ ForeignKey , „ DecimalField ir pan. Tai yra pagrindinis skirtumas

  • null=True Tik null=True
  • blank=True tik blank=True
  • null=True , blank=True

palyginti skirtingi ( CharField , ForeignKey , ManyToManyField , DateTimeField ) laukai. Kokie yra 1/2/3 naudojimo privalumai ir trūkumai?

622
22 дек. nustatė user993563 gruodžio 22 d 2011-12-22 23:11 '11, 23:11, 2011-12-22 23:11
@ 9 atsakymai

null=True rinkiniai NULL (lyginant su NOT NULL ) stulpelyje jūsų duomenų bazėje. Django laukų tipų, pvz., „ DateTimeField arba „ ForeignKey , tuščios vertės duomenų bazėje bus saugomos kaip NULL .

blank=True nustato, ar formose reikia lauko. Tai apima administratorių ir savo pasirinktines formas. Jei blank=True , laukas nebūtinas, o jei jis yra False , laukas negali būti tuščias.

Šių dviejų komandų derinys yra toks dažnas, kad, jei norite, kad laukas būtų tuščias jūsų formoje, jums reikės ir duomenų bazės, kad išspręstumėte šios srities NULL reikšmes. Išimtis yra „ CharField ir „ TextField s“, kurie niekada nėra saugomi kaip „ NULL “ „Django“. Tuščios vertės saugomos duomenų bazėje kaip tuščia eilutė ( '' ).

Keletas pavyzdžių:

 models.DateTimeField(blank=True) # raises IntegrityError if blank models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form 

Akivaizdu, kad šie du parametrai nesinaudoja logine prasme (nors precedentas gali būti naudojamas null=True, blank=False jei norite, kad laukas visada būtų reikalaujamas formose, bet nebūtinai dirbant su objektu per kažką panašaus į apvalkalą.)

 models.CharField(blank=True) # No problem, blank is stored as '' models.CharField(null=True) # NULL allowed, but will never be set as NULL 

CHAR ir TEXT tipai niekada nėra saugomi kaip NULL Django, todėl null=True nereikalinga. Tačiau galite rankiniu būdu nustatyti vieną iš šių laukų į None kad nustatytumėte jį į NULL . Jei turite scenarijų, kur tai gali būti reikalinga, turite įjungti null=True .

748
22 дек. Chris Pratt atsakymas gruodžio 22 d 2011-12-22 23:35 '11 11:35 PM 2011-12-22 23:35

Taigi, ORM rodo blank ir null laukus 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) 

Duomenų bazių laukai, sukurti „ PostgreSQL 9.4“ :

border=0
 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) ) 

5.6 MySQL sukurtos duomenų bazės sritys:

 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 ) 
75
16 февр. vartotojo atsakymas, pateiktas vasario 16 d 2014-02-16 17:00 '14, 17:00, 2014-02-16 17:00

Kaip nurodyta Django modelio lauko aprašyme: Nuoroda

Lauko parametrai

Toliau pateikti argumentai galimi visiems lauko tipams. Visi jie yra neprivalomi.


null

Field.null

Jei True , „Django“ duomenų bazėje išsaugos null reikšmes. False yra False .

Venkite naudoti null styginių laukams, pvz., „ CharField ir „ TextField , nes tuščios eilutės reikšmės visada bus saugomos kaip tuščios eilutės, o ne kaip null . Jei eilutės lauke yra null=True , tai reiškia, kad ji turi dvi galimas reikšmes „be duomenų“: null ir tuščią eilutę. Daugeliu atvejų jos atleidimas turi dvi galimas reikšmes „nėra duomenų“; Django konvencija turėtų naudoti tuščią eilutę, o ne null .

Laukų eilutėse ir ne eilutėse taip pat reikia nustatyti blank=True jei norite leisti tuščias reikšmes formose, nes null parametras veikia tik duomenų bazės saugyklą (žr. blank ).

Pastaba

Naudojant „Oracle“ duomenų bazės kopiją, NULL reikšmė bus saugoma, kad būtų rodoma tuščia eilutė, nepriklausomai nuo šio atributo.


blank

Field.blank

Jei True , laukas gali būti tuščias. False yra False .

Atkreipkite dėmesį, kad tai skiriasi nuo null . null yra tik su duomenų baze susijusi informacija, o blank yra susijęs su patvirtinimu. Jei lauke yra blank=True , formos patvirtinimas leis įvesti tuščią vertę. Jei lauke yra blank=False , laukas bus reikalingas.

17
16 апр. DiogoLR atsakymas, pateiktas balandžio 16 d 2014-04-16 21:54 '14, 21:54, 2014-04-16 21:54

Tiesiog null=True nurodo, kad duomenų bazė turėtų būti NULL , kita vertus, blank=True nustato, ar šis laukas turi būti tuščias, kai pažymima forma (jei blank=True užpildo formą be vertės šiame lauke ir blank=False [value numatytasis], kai bus tikrinama forma, bus rodomas šis laukas .

null=True/False susijusi su duomenų baze

blank=True/False formų patvirtinimui

15
11 сент. Atsakymas pateikiamas Ranju R 11 sep . 2014-09-11 07:26 '14, 2014-09-11 07:26

Apsvarstant galimybes apibrėžti „Django“ modelį, svarbu suprasti, kad jie yra (bent) du tikslai: duomenų bazės lentelių apibrėžimas ir numatytojo formato nustatymas bei modelių formų patvirtinimas. (Sakau „numatytasis“, nes vertės visada gali būti pakeistos pateikiant pasirinktinę formą.) Kai kurie parametrai veikia duomenų bazę, kai kurie parametrai veikia formas, o kai kurie - abu.

Kai kalbama apie null ir blank , kiti atsakymai jau parodė, kad pirmasis veikia duomenų bazės lentelės apibrėžimą, o pastarasis veikia modelio patvirtinimą. Manau, kad šis skirtumas gali būti dar aiškesnis, jei pažvelgsime į visų keturių galimų konfigūracijų naudojimo atvejus:

  • null=False , blank=False : tai yra numatytoji konfigūracija ir reiškia, kad ši vertė yra būtina bet kokiomis aplinkybėmis.

  • null=True , blank=True : tai reiškia, kad laukas bet kokiomis aplinkybėmis yra neprivalomas. (Kaip nurodyta toliau, tačiau tai nėra rekomenduojamas būdas, kaip padaryti, kad eilutės laukai būtų neprivalomi.)

  • null=False , blank=True : tai reiškia, kad formai nereikia vertės, o duomenų bazės. Tam yra keli naudojimo būdai:

    • Dažniausiai šis konfigūravimas naudojamas pasirinktiniams eilutės laukams. Kaip pažymėta dokumentuose , Django idiomas turėtų naudoti tuščią eilutę, nurodydamas trūkstamą vertę. Jei taip pat būtų išspręsta NULL , jums būtų du skirtingi būdai, kaip nurodyti trūkstamą vertę, kuri būtų mažesnė nei ideali.

    • Kita paplitusi situacija yra ta, kad norite apskaičiuoti vieną lauką automatiškai, remiantis kito (pvz., save() metodu. Nenorite, kad vartotojas pateiktų formoje vertę (taigi, blank=True ), bet norite, kad duomenų bazė užtikrintų, jog vertė visada būtų pateikta ( null=False ).

    • Kitas šios konfigūracijos naudojimas yra tada, kai norite nurodyti, kad „ ManyToManyField yra neprivaloma. Kadangi šis laukas yra įgyvendinamas kaip atskira lentelė, o ne duomenų bazės stulpelis, „ null yra prasminga . blank vertės vertė vis dar turės įtakos formoms, nors ji kontroliuoja, ar patvirtinimas bus sėkmingas, jei nebus jokių ryšių.

  • null=True , blank=False : tai reiškia, kad formai reikia vertės, bet ne duomenų bazėje. Tai gali būti dažniausiai naudojama konfigūracija, tačiau tam tikri naudojimo būdai:

    • Visiškai protinga reikalauti, kad jūsų naudotojai visada įtrauktų vertę, net jei ji nėra reikalinga jūsų verslo logikoje. Galų gale, formos yra tik vienas būdas pridėti ir redaguoti duomenis. Galite turėti kodą, kuris generuoja duomenis, kuriems nereikia to paties griežto patikrinimo, kurį norite reikalauti iš žmogaus redaktoriaus.

    • Kitas naudojimo atvejis, kurį mačiau, yra tai, kai turite „ ForeignKey , kuriam nenorite leisti kaskados . Tai reiškia, kad įprastu būdu ryšys visada turi būti ( blank=False ), bet jei tai, kas rodo, kad jis yra ištrintas, nenorite, kad šis objektas būtų ištrintas. Tokiu atveju galite naudoti null=True ir on_delete=models.SET_NULL kad on_delete=models.SET_NULL paprastą minkštos ištrynimo rūšį.

6
01 дек. Atsakymas, kurį pateikė Kevin Christopher Henry Dec 01 2017-12-01 12:20 '17 at 12:20 2017-12-01 12:20

Čia yra lauko, kuriame yra tuščias = tikras ir null = tikrasis aprašymas, pavyzdžiai. Modeliai. TextField (tuščias = tikras, nulinis = tikras)

Šiuo atveju: blank = True: nurodo mūsų formai, kad yra normalu palikti aprašymo lauką tuščią.

ir

null = True: nurodo mūsų duomenų bazei, kad yra normalu nulinę vertę įrašyti į mūsų db lauką ir neduoti klaidos.

1
02 янв. atsakymas pateikiamas Stryker 02 jan. 2017-01-02 00:42 '17 ne 0:42 2017-01-02 00:42

Manau, kad jums gali būti įdomu išsaugoti tuščią, neaktyvią CharField kaip nulinę, o ne kaip tuščią eilutę . Yra daug diskusijų apie tai ir labai praktinė problema, su kuria galite susidurti (pvz., Norite pridėti atvirą URL kiekvienam vartotojui, kuris gali būti niekinis ir turėtų būti unikalus).

0
25 апр. atsakymą pateikė Ramwin balandžio 25 d 2018-04-25 09:46 '18 ne 9:46 2018-04-25 09:46

Kai išsaugome kažką „Django“ administratoriaus, atliekami du patikrinimo etapai, Django lygiu ir duomenų bazės lygmeniu. Negalime išsaugoti teksto numerių lauke.

Duomenų bazėje yra duomenų tipas NULL, tai nėra nieko. Kai Django sukuria stulpelius duomenų bazėje, tai rodo, kad jie negali būti tušti. Jei bandysite išsaugoti NULL, gausite duomenų bazės klaidą.

Be to, „Django-Admin“ lygmenyje visi laukai yra būtini, negalite išsaugoti tuščio lauko, Django pateikia klaidos pranešimą.

Taigi, jei norite išsaugoti tuščią lauką, turite jį įjungti Django ir duomenų bazių lygiuose. blank = True - įjungti tuščią lauką administratoriaus skydelyje null = True - leidžia išsaugoti NULL duomenų bazės stulpelyje.

0
12 мая '17 в 2:58 2017-05-12 02:58 Atsakymą pateikė Jurijus Kots gegužės 12 d. 17:28 2:58 2017-05-12 02:58
 null = True 

Tai reiškia, kad duomenų bazėje nėra užpildomų laukų duomenų, todėl galite turėti objektą su nulio reikšme laukui, kuriame yra šis parametras.

 blank = True 

Tai reiškia, kad django formose nėra patvirtinimo apribojimų. todėl modelForm šio modelio modelį, galite palikti šį lauką tuščią.

0
16 июля '18 в 8:15 2018-07-16 08:15 atsakymą įteikė Milad Kh , liepos 16 d. 18 val. 8:15 val. 2018-07-16 08:15

Kiti klausimai apie žymes „ arba „ Užduoti klausimą“