ความแตกต่าง null = True, blank = True ใน django


902

เมื่อเราเพิ่มฟิลด์ฐานข้อมูลใน django โดยทั่วไปเราเขียน:

models.CharField(max_length=100, null=True, blank=True)

เช่นเดียวกับที่ทำกับForeignKey, DecimalFieldฯลฯ คืออะไรแตกต่างขั้นพื้นฐานในการมี

  1. null=True เท่านั้น
  2. blank=True เท่านั้น
  3. null=True, blank=True

ในแง่ที่แตกต่างกัน ( CharField, ForeignKey, ManyToManyField, DateTimeField) สาขา ข้อดี / ข้อเสียของการใช้ 1/2/3 คืออะไร


8
คุณมีคำตอบที่ดีเกี่ยวกับที่นี่: stackoverflow.com/questions/8159310/ …และที่นี่: stackoverflow.com/questions/4384098//
juliomalegria


ใช่ฉันยังมี USECASE นี้กับForeignKeyมีแต่ไม่มีblank=True null=Trueเมื่อบันทึกโมเดลฉันต้องการ "เผยแพร่" โดยอัตโนมัติโดยสร้างรายการที่เผยแพร่จากนั้น ดังนั้นฉันไม่สามารถบันทึกnullลงในฐานข้อมูลเนื่องจากทุกรุ่นต้องเป็น "เผยแพร่" แต่ฉันต้องการปล่อยให้ฟิลด์นั้นว่างใน admin
osa

ฉันคิดว่าคุณอาจสนใจ [บันทึกช่องว่าง CharField ที่ว่างเปล่าเป็นโมฆะแทนที่จะเป็นสตริงว่างเปล่า] ( code.djangoproject.com/ticket/4136 ) มีการถกเถียงกันมากมายเกี่ยวกับเรื่องนี้และปัญหาที่เกิดขึ้นจริงที่คุณอาจพบ (เช่นคุณต้องการเพิ่ม URL ของ openid สำหรับผู้ใช้แต่ละคนซึ่งอาจเป็นโมฆะและควรไม่ซ้ำกัน)
ramwin

คำตอบ:


1082

null=TrueชุดNULL(เทียบกับNOT NULL) ในคอลัมน์ในฐานข้อมูลของคุณ ค่าว่างสำหรับประเภทเขตข้อมูล Django เช่นDateTimeFieldหรือForeignKeyจะถูกเก็บไว้NULLในฐานข้อมูล

blankกำหนดว่าจะต้องมีข้อมูลในรูปแบบ ซึ่งรวมถึงผู้ดูแลระบบและแบบฟอร์มที่กำหนดเองของคุณ ถ้าblank=Trueฟิลด์นั้นไม่จำเป็นต้องใช้ในขณะที่ถ้ามันเป็นFalseฟิลด์ที่ไม่สามารถว่างเปล่า

คอมโบของทั้งสองนั้นบ่อยมากเพราะโดยทั่วไปถ้าคุณจะอนุญาตให้ฟิลด์ว่างในแบบฟอร์มของคุณคุณจะต้องใช้ฐานข้อมูลของคุณเพื่ออนุญาตNULLค่าสำหรับฟิลด์นั้น ยกเว้นเป็นCharFieldและTextFields ซึ่งใน Django จะไม่เคยNULLถูกบันทึกเป็น ค่าว่างถูกเก็บไว้ใน DB เป็นสตริงว่าง ( '')

ตัวอย่างบางส่วน:

models.DateTimeField(blank=True) # raises IntegrityError if blank

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

เห็นได้ชัดว่าตัวเลือกทั้งสองนั้นไม่มีเหตุผลที่จะใช้ (แม้ว่าอาจจะมีกรณีการใช้งานnull=True, blank=Falseหากคุณต้องการให้ฟิลด์ต้องมีรูปแบบเสมอตัวเลือกเมื่อจัดการกับวัตถุผ่านสิ่งต่าง ๆ เช่นเชลล์)

models.CharField(blank=True) # No problem, blank is stored as ''

models.CharField(null=True) # NULL allowed, but will never be set as NULL

CHARและTEXTประเภทจะไม่ถูกบันทึกNULLโดย Django ดังนั้นจึงnull=Trueไม่จำเป็น อย่างไรก็ตามคุณสามารถตั้งค่าด้วยตนเองหนึ่งฟิลด์เหล่านี้เพื่อที่จะมีผลบังคับใช้ตั้งเป็นNone หากคุณมีสถานการณ์ที่ที่อาจจะมีความจำเป็นที่คุณยังควรจะรวมถึงNULLnull=True


8
IntegrityErrorจะเพิ่มขึ้นเมื่อ Django พยายามที่จะบันทึกบันทึกลงในฐานข้อมูล ผู้ใช้ไม่จำเป็นต้องกรอกข้อมูลในฟิลด์และนั่นเป็นปัญหาเพราะในระดับฐานข้อมูลไม่ใช่โมฆะ
Chris Pratt

5
ไม่คริสพยายามชี้ให้เห็นว่าเหตุใดการว่าง = True โดยไม่มี null = True จะทำให้เกิดปัญหาใน DateTimeField
Vinod Kurup

4
หมายเหตุสำหรับผู้ใช้ Oracle: ไม่เป็นความจริงที่ " CHARและTEXTไม่เคยถูกบันทึกNULLโดย Django" มันเป็นความจริงสำหรับแบ็กเอนด์ส่วนใหญ่ แต่ Oracle จะบังคับสตริงว่างให้เป็น NULL ดังนั้นแบ็กเอนด์ Django Oracle เป็นข้อยกเว้นของข้อความข้างต้นDjango Docs
stv

10
@ChrisPratt การแก้ไขเล็กน้อยในโพสต์ของคุณ: CharFields สามารถรับการบันทึกเป็น NULL ในฐานข้อมูล (แปลเป็นNonePython) หากคุณตั้งค่า null = True เอกสารแม้แต่จะบอกเพื่อหลีกเลี่ยงการตั้งค่า null = true เพราะจะช่วยให้ทั้งสองชนิดที่แตกต่างของค่า "blanky" ฉันเพิ่งทดสอบพฤติกรรมนี้กับ Django 1.8 / MySQL 5.6
Edward D'Souza เมื่อ

3
จะไม่มีใครที่จะไปพูดถึงการรวมกันของ: blank=True, null=False, default="something"?
Brian H.

124

นี่คือลักษณะของแผนที่blankและnullฟิลด์ORM สำหรับ 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)        

ฟิลด์ฐานข้อมูลที่สร้างขึ้นสำหรับPostgreSQL 9.4ได้แก่ :

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)
)

ฟิลด์ฐานข้อมูลที่สร้างสำหรับMySQL 5.6คือ:

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
)

41
กล่าวอีกนัยหนึ่งblankไม่มีผลกับฐานข้อมูลและnullควบคุมว่าคอลัมน์ฐานข้อมูลอนุญาตNULLค่าได้หรือไม่ blankคำตอบนี้เป็นทางยาวจริงๆบอกว่าและไม่ได้ให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับ
คาร์ลเมเยอร์

19
@CarlMeyer: ฉันต้องการดูว่ามันจะแมปไปยังฐานข้อมูลและแชร์ได้อย่างไรเพราะจะช่วยประหยัดเวลาให้ผู้อื่นทำเช่นเดียวกัน ตัวอย่างทฤษฎีเทียบสร้างความแตกต่างเมื่อมันมาถึงการดูดซึมและมุ่งมั่นที่จะหน่วยความจำ อันที่จริงฉันออกนอกเส้นทางเพื่อเพิ่มการแมปสำหรับฐานข้อมูลที่ฉันไม่ได้ใช้ ขอบคุณสำหรับ downvote จำนวนคนที่พบว่ามีประโยชน์นี้ไม่เห็นด้วยกับคุณ
ผู้ใช้

5
อาจเป็นคำตอบที่มีประโยชน์หากคุณได้ข้อสรุปสรุปจากข้อมูลที่นำเสนอ แต่ฉันไม่คิดว่าการนำเสนอการถ่ายโอนข้อมูลดิบเป็นคำตอบที่มีประโยชน์ ในกรณีนี้จริง ๆ แล้วมันเป็นคำตอบที่ทำให้เข้าใจผิดเนื่องจาก (โดยไม่มีความคิดเห็นเพิ่มเติม) แสดงว่าผลกระทบของทั้งคู่blankและnullควรถูกสะท้อนในคอลัมน์blankฐานข้อมูล ผู้อื่นมีอิสระในการโหวตถ้าพวกเขาพบว่ามีประโยชน์ เป็นไปได้สำหรับผู้ที่เข้าใจผิดโดยคำตอบที่ทำให้เข้าใจผิดว่าเป็นประโยชน์
คาร์ลเมเยอร์

4
คำตอบที่ยอมรับซึ่งอายุเกือบ 3 ปีอธิบายรายละเอียดทุกอย่าง ไม่มีจุดในการทำซ้ำข้อมูลเดียวกันที่นี่
ผู้ใช้

47

ดังที่ได้กล่าวไว้ในการอ้างอิงภาคสนามของ Django Model: Link

ตัวเลือกฟิลด์

อาร์กิวเมนต์ต่อไปนี้มีให้สำหรับทุกประเภทฟิลด์ ทั้งหมดเป็นตัวเลือก


null

Field.null

ถ้าTrueDjango จะเก็บค่าว่างไว้NULLในฐานข้อมูล Falseเริ่มต้นคือ

หลีกเลี่ยงการใช้nullในช่องสตริงที่ใช้เช่นCharFieldและ เนื่องจากค่าสตริงที่ว่างเปล่าจะถูกเก็บไว้เป็นสตริงที่ว่างเปล่าไม่เป็นTextField NULLหากเขตข้อมูลแบบสตริงมีnull=Trueหมายความว่ามันมีค่าที่เป็นไปได้สองค่าสำหรับ "no data": NULLและสตริงว่าง ในกรณีส่วนใหญ่มันซ้ำซ้อนที่จะมีสองค่าที่เป็นไปได้สำหรับ "ไม่มีข้อมูล"; การประชุม Django NULLคือการใช้สตริงว่างไม่ได้

สำหรับฟิลด์ทั้งแบบใช้สตริงและไม่ใช่แบบสตริงคุณจะต้องตั้งค่าblank=Trueหากคุณต้องการอนุญาตให้มีค่าว่างในรูปแบบเนื่องจากnullพารามิเตอร์จะมีผลเฉพาะกับที่จัดเก็บฐานข้อมูล (ดูblank)

บันทึก

เมื่อใช้แบ็กเอนด์ฐานข้อมูล Oracle ค่า NULL จะถูกเก็บไว้เพื่อแสดงถึงสตริงว่างโดยไม่คำนึงถึงคุณลักษณะนี้


blank

Field.blank

ถ้าTrueฟิลด์นั้นว่างเปล่า Falseเริ่มต้นคือ

nullโปรดทราบว่านี้จะแตกต่างกว่า nullเกี่ยวข้องกับฐานข้อมูลอย่างblankแท้จริงในขณะที่เกี่ยวข้องกับการตรวจสอบ ถ้าเขตข้อมูลมีblank=Trueการตรวจสอบแบบฟอร์มจะอนุญาตให้ป้อนค่าว่าง ถ้าเขตข้อมูลมีblank=Falseเขตข้อมูลจะต้อง


46

สิ่งสำคัญคือต้องเข้าใจว่าตัวเลือกในการกำหนดเขตข้อมูลแบบจำลอง Django ให้บริการ (อย่างน้อย) วัตถุประสงค์สองประการ: การกำหนดตารางฐานข้อมูลและการกำหนดรูปแบบเริ่มต้นและการตรวจสอบความถูกต้องของรูปแบบโมเดล (ฉันพูดว่า "ค่าเริ่มต้น" เพราะค่าสามารถถูกแทนที่โดยการให้แบบฟอร์มที่กำหนดเอง) ตัวเลือกบางอย่างมีผลต่อฐานข้อมูลตัวเลือกบางอย่างมีผลต่อรูปแบบและบางส่วนมีผลต่อทั้งสอง

เมื่อมันมาถึงnullและblankคำตอบอื่น ๆ ได้ทำให้ชัดเจนแล้วว่าอดีตมีผลกระทบต่อคำนิยามตารางฐานข้อมูลและหลังมีผลต่อการตรวจสอบรูปแบบ ฉันคิดว่าความแตกต่างสามารถทำให้ชัดเจนยิ่งขึ้นโดยดูที่กรณีการใช้งานสำหรับการกำหนดค่าที่เป็นไปได้ทั้งสี่:

  • null=False, blank=False: นี่คือการกำหนดค่าเริ่มต้นและหมายความว่าจำเป็นต้องใช้ค่าในทุกสถานการณ์

  • null=True, blank=True: หมายความว่าฟิลด์นี้เป็นตัวเลือกในทุกสถานการณ์ (ดังที่ระบุไว้ด้านล่าง แต่นี่ไม่ใช่วิธีที่แนะนำในการทำให้ฟิลด์เป็นแบบสตริงเป็นทางเลือก)

  • null=False, blank=True: หมายความว่าแบบฟอร์มไม่ต้องการค่า แต่มีฐานข้อมูล มีหลายกรณีการใช้งานสำหรับสิ่งนี้:

    • การใช้งานทั่วไปส่วนใหญ่มีไว้สำหรับเขตข้อมูลแบบสตริงที่เป็นตัวเลือก ดังที่บันทึกไว้ในเอกสารประกอบของ Django สำนวนคือการใช้สตริงที่ว่างเปล่าเพื่อระบุค่าที่ขาดหายไป หากNULLได้รับอนุญาตคุณจะต้องจบด้วยสองวิธีที่แตกต่างกันเพื่อระบุค่าที่ขาด

    • สถานการณ์ทั่วไปอีกอย่างหนึ่งคือคุณต้องการคำนวณเขตข้อมูลหนึ่งโดยอัตโนมัติตามค่าของอีกเขตข้อมูลหนึ่ง (ในsave()วิธีการของคุณพูด) คุณไม่ต้องการให้ผู้ใช้ระบุค่าในรูปแบบ (ดังนั้นblank=True) แต่คุณต้องการให้ฐานข้อมูลบังคับใช้ว่ามีการจัดเตรียมค่าไว้เสมอ ( null=False)

    • การใช้งานอื่นคือเมื่อคุณต้องการระบุว่าManyToManyFieldเป็นทางเลือก เพราะข้อมูลนี้จะถูกนำมาใช้เป็นตารางแยกมากกว่าคอลัมน์ฐานข้อมูลที่มีความหมายnull ค่าของblankจะยังคงส่งผลกระทบต่อรูปแบบแม้ว่าการควบคุมหรือไม่ตรวจสอบจะประสบความสำเร็จเมื่อไม่มีความสัมพันธ์

  • null=True, blank=False: หมายความว่าฟอร์มต้องการค่า แต่ฐานข้อมูลไม่ นี่อาจเป็นการกำหนดค่าที่ใช้งานบ่อย แต่มีบางกรณีที่ใช้งานได้:

    • มีเหตุผลอย่างสมบูรณ์ที่จะต้องให้ผู้ใช้ของคุณรวมถึงค่าเสมอแม้ว่ามันจะไม่จำเป็นต้องใช้ตรรกะทางธุรกิจของคุณก็ตาม ท้ายที่สุดฟอร์มเป็นเพียงวิธีเดียวในการเพิ่มและแก้ไขข้อมูล คุณอาจมีรหัสที่สร้างข้อมูลซึ่งไม่จำเป็นต้องมีการตรวจสอบที่เข้มงวดเช่นเดียวกับที่คุณต้องการให้มีการแก้ไขโดยมนุษย์

    • กรณีการใช้งานอื่น ๆ ที่ผมเคยเห็นคือเมื่อคุณมีForeignKeyที่คุณไม่ต้องการที่จะช่วยให้การลบน้ำตก นั่นคือในการใช้งานตามปกติความสัมพันธ์ควรอยู่ที่นั่นเสมอ ( blank=False) แต่หากสิ่งที่ชี้ไปที่เกิดขึ้นถูกลบคุณไม่ต้องการให้วัตถุนี้ถูกลบเช่นกัน ในกรณีนี้คุณสามารถใช้null=Trueและon_delete=models.SET_NULLนำการลบแบบอ่อน ๆไปปฏิบัติได้


1
นี่เป็นคำตอบที่สมบูรณ์แบบชุดค่าผสมที่เป็นไปได้ทั้งหมดได้รับการอธิบายอย่างกระชับ!
RusI

1
ควรเป็นคำตอบที่ยอมรับได้
Tom Mac

28

คุณอาจมีคำตอบของคุณอย่างไรก็ตามจนถึงวันนี้มันยากที่จะตัดสินว่าจะใส่ null = True หรือ blank = True หรือทั้งสองฟิลด์ โดยส่วนตัวฉันคิดว่ามันค่อนข้างไร้ประโยชน์และสร้างความสับสนให้กับตัวเลือกมากมายสำหรับนักพัฒนา ปล่อยให้จัดการโมฆะหรือช่องว่างตามที่พวกเขาต้องการ

ฉันติดตามตารางนี้จากTwo Scoops ของ Django :ป้อนคำอธิบายรูปภาพที่นี่

ตารางแสดงเวลาที่จะใช้ null หรือว่างสำหรับแต่ละฟิลด์


26

เพียงแค่null=Trueกำหนดฐานข้อมูลควรจะยอมรับNULLค่าในมืออื่น ๆblank=Trueกำหนดในการตรวจสอบรูปแบบข้อมูลนี้ควรจะยอมรับค่าว่างเปล่าหรือไม่ (ถ้าblank=Trueมันยอมรับรูปแบบโดยไม่ต้องมีค่าในฟิลด์ที่และblank=False[ค่าเริ่มต้น] บนตรวจสอบรูปแบบก็จะแสดงฟิลด์นี้จะต้องมีข้อผิดพลาด

null=True/False เกี่ยวข้องกับฐานข้อมูล

blank=True/False เกี่ยวข้องกับการตรวจสอบแบบฟอร์ม


11

นี่คือตัวอย่างของฟิลด์ด้วยblank= Trueและnull=True

description = รูปแบบ TextField (ว่าง = True, null = True)

ในกรณีนี้ blank = True:: บอกแบบฟอร์มของเราว่าไม่ต้องเว้นฟิลด์คำอธิบาย

และ

null = True: บอกฐานข้อมูลของเราว่ามันก็โอเคที่จะบันทึกค่าเป็นศูนย์ในฐานข้อมูลของเราและไม่ให้ข้อผิดพลาด


7

นี่คือความแตกต่างที่สำคัญของnull=Trueและblank=True:

ค่าเริ่มต้นของทั้งสองnullและblankเป็นเท็จ ทั้งค่าเหล่านี้ทำงานในระดับเขตคือไม่ว่าเราต้องการที่จะให้สนามหรือnullblank

null=Trueจะตั้งค่าของฟิลด์เป็นNULLเช่นไม่มีข้อมูล มันเป็นพื้นสำหรับค่าคอลัมน์ฐานข้อมูล

date = models.DateTimeField(null=True)

blank=Trueกำหนดว่าจะต้องมีฟิลด์ในรูปแบบ ซึ่งรวมถึงผู้ดูแลระบบและแบบฟอร์มที่คุณกำหนดเอง

title = models.CharField(blank=True) // title can be kept blank. ในฐานข้อมูล("")จะถูกเก็บไว้ null=True blank=Trueซึ่งหมายความว่าฟิลด์เป็นตัวเลือกในทุกสถานการณ์

epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a

6
null = True

หมายความว่าไม่มีข้อ จำกัด ของฐานข้อมูลสำหรับการเติมฟิลด์ดังนั้นคุณสามารถมีวัตถุที่มีค่า Null สำหรับการเติมที่มีตัวเลือกนี้

blank = True

หมายความว่าไม่มีข้อ จำกัด ของการตรวจสอบในรูปแบบ django ดังนั้นเมื่อคุณกรอกข้อมูลmodelFormสำหรับรุ่นนี้คุณสามารถออกจากฟิลด์ด้วยตัวเลือกนี้ที่ไม่ได้กรอกข้อมูล


6

ค่าเริ่มต้นเป็นโมฆะและว่างเปล่าเป็นเท็จ

Null: มันเกี่ยวข้องกับฐานข้อมูล กำหนดว่าคอลัมน์ฐานข้อมูลที่กำหนดจะยอมรับค่า Null หรือไม่

ว่างเปล่า: มันเกี่ยวข้องกับการตรวจสอบ มันจะถูกใช้ในระหว่างการตรวจสอบแบบฟอร์มเมื่อเรียก form.is_valid ()

ที่ถูกกล่าวว่ามันเป็นเรื่องสมบูรณ์แบบที่จะมีเขตข้อมูลที่มีค่า null = True และ blank = False ความหมายในระดับฐานข้อมูลเขตข้อมูลสามารถเป็น NULL แต่ในระดับแอปพลิเคชันเป็นเขตข้อมูลที่จำเป็น

ตอนนี้ที่นักพัฒนาซอฟต์แวร์ส่วนใหญ่เข้าใจผิด: การกำหนด null = True สำหรับฟิลด์แบบอิงสตริงเช่น CharField และ TextField หลีกเลี่ยงการทำเช่นนั้น มิฉะนั้นคุณจะต้องมีสองค่าที่เป็นไปได้สำหรับ“ ไม่มีข้อมูล” นั่นคือ: ไม่มีและสตริงว่าง มีสองค่าที่เป็นไปได้สำหรับ“ ไม่มีข้อมูล” ซ้ำซ้อน ระเบียบการประชุมของ Django คือใช้สตริงที่ว่างเปล่าไม่ใช่ NULL


5

เมื่อเราบันทึกอะไรใน Django ผู้ดูแลระบบการตรวจสอบสองขั้นตอนเกิดขึ้นในระดับ Django และในระดับฐานข้อมูล เราไม่สามารถบันทึกข้อความในฟิลด์ตัวเลข

ฐานข้อมูลมีชนิดข้อมูลเป็น NULL ไม่มีอะไรเกิดขึ้น เมื่อ Django สร้างคอลัมน์ในฐานข้อมูลจะระบุว่าคอลัมน์เหล่านั้นต้องไม่ว่างเปล่า และถ้าคุณจะพยายามบันทึกค่า NULL คุณจะได้รับข้อผิดพลาดของฐานข้อมูล

นอกจากนี้ในระดับ Django-Admin ทุกฟิลด์ถูกกำหนดโดยค่าเริ่มต้นคุณไม่สามารถบันทึกฟิลด์ว่างได้ Django จะโยนข้อผิดพลาดให้คุณ

ดังนั้นหากคุณต้องการบันทึกฟิลด์ว่างคุณจำเป็นต้องอนุญาตในระดับ Django และฐานข้อมูล blank = True - จะอนุญาตให้มีฟิลด์ว่างในแผงผู้ดูแลระบบ null = True - จะอนุญาตให้บันทึก NULL ไว้ในคอลัมน์ฐานข้อมูล


5

มีจุดหนึ่งที่null=Trueจะจำเป็นแม้ในCharFieldหรือTextFieldนั่นคือเมื่อฐานข้อมูลมีการuniqueตั้งค่าสถานะสำหรับคอลัมน์

กล่าวอีกนัยหนึ่งถ้าคุณมี Char / TextField เฉพาะใน Django คุณจะต้องใช้สิ่งนี้:

models.CharField(blank=True, null=True, unique=True)

สำหรับ CharField ที่ไม่ซ้ำกันหรือ TextField คุณจะดีกว่าการข้ามnull=Trueมิฉะนั้นบางฟิลด์จะถูกตั้งค่าเป็น NULL ขณะที่คนอื่น ๆ เป็น "" และคุณจะต้องตรวจสอบค่าฟิลด์สำหรับ NULL ทุกครั้ง


3

nullสำหรับฐานข้อมูลและว่างเปล่าสำหรับการตรวจสอบความถูกต้องของเขตข้อมูลที่คุณต้องการแสดงในส่วนติดต่อผู้ใช้เช่น textfield เพื่อรับนามสกุลของบุคคล หากนามสกุล = models.charfield (ว่าง = จริง)มันไม่ได้ขอให้ผู้ใช้ป้อนนามสกุลเพราะนี่คือฟิลด์ตัวเลือกในขณะนี้ ถ้าlastname = models.charfield (null = true) ก็หมายความว่าถ้าฟิลด์นี้ไม่ได้รับค่าใด ๆ จากผู้ใช้ก็จะเก็บไว้ในฐานข้อมูลเป็นสตริงว่าง ""


1

ความหมายของ null = True และ blank = True ในโมเดลยังขึ้นอยู่กับวิธีที่ฟิลด์เหล่านี้ถูกกำหนดในคลาสฟอร์ม

สมมติว่าคุณได้กำหนดคลาสต่อไปนี้:

class Client (models.Model):
    name = models.CharField (max_length=100, blank=True)
    address = models.CharField (max_length=100, blank=False)

ถ้าคลาสของฟอร์มถูกกำหนดเช่นนี้:

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'})
        }

จากนั้นฟิลด์ 'ชื่อ' จะไม่บังคับ (เนื่องจาก blank = True ในโมเดล) และฟิลด์ 'address' จะถูกบังคับ (เนื่องจาก blank = False ในโมเดล)

อย่างไรก็ตามหากคลาส ClientForm ถูกกำหนดเช่นนี้:

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'}),
    )

จากนั้นทั้งสองฟิลด์ ('ชื่อ' และ 'ที่อยู่') จะถูกบังคับ"เนื่องจากฟิลด์ที่กำหนดไว้จะถูกประกาศให้เป็นไปตาม" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) นั่นคือค่าเริ่มต้นสำหรับแอตทริบิวต์ 'ต้องมี' ของเขตข้อมูลฟอร์มเป็นจริงและสิ่งนี้จะต้องกรอกข้อมูล 'ชื่อ' และ 'ที่อยู่' ถึงแม้ว่าในโมเดลนั้นเขตข้อมูลจะถูกตั้งค่าเป็นว่าง = True


0

null - ค่าเริ่มต้นคือ False ถ้าเป็นจริง Django จะเก็บค่าว่างไว้เป็น null ในฐานข้อมูล

ที่ว่างเปล่า - ค่าเริ่มต้นคือเท็จถ้าเป็นจริงเขตข้อมูลนั้นจะได้รับอนุญาตให้ว่าง

เพิ่มเติมไปที่ https://docs.djangoproject.com/en/3.0/topics/db/models/


0

ตารางด้านล่างนี้แสดงให้เห็นถึงความแตกต่างที่สำคัญ:

+--------------------------------------------------------------------+
| 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           |
+--------------------------------------------------------------------+

0

ในคำง่ายมาก ,

ช่องว่างต่างจากค่าว่าง

nullเป็นอย่างหมดจดเกี่ยวข้องกับฐานข้อมูลในขณะที่ว่างเปล่ามีการตรวจสอบที่เกี่ยวข้อง (จำเป็นต้องใช้ในรูปแบบ)

ถ้าnull=TrueDjango store empty values as NULL in the databaseต้องการ ถ้าเขตข้อมูลมีการตรวจสอบรูปแบบจะblank=True allow entry of an empty valueถ้าเขตข้อมูลมีค่าว่าง = เท็จจำเป็นต้องป้อนเขตข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.