Ketika kita menambahkan bidang database di Django, kita biasanya menulis:
models.CharField(max_length=100, null=True, blank=True)
Hal yang sama dilakukan dengan ForeignKey
, DecimalField
dll. Apa perbedaan mendasar dalam memiliki
null=True
hanyablank=True
hanyanull=True
,blank=True
dalam hal yang berbeda ( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
bidang). Apa kelebihan / kekurangan menggunakan 1/2/3?
python
django
django-models
pengguna993563
sumber
sumber
ForeignKey
denganblank=True
, tetapi tanpanull=True
. Ketika model disimpan, saya ingin "mempublikasikan" secara otomatis dengan membuat entri yang diterbitkan dari itu. Jadi saya tidak dapat menyimpannull
ke database, karena setiap model harus "dipublikasikan", tetapi saya ingin dapat membiarkan bidang itu kosong di admin.Jawaban:
null=True
setNULL
(versusNOT NULL
) pada kolom di DB Anda. Nilai kosong untuk tipe bidang Django sepertiDateTimeField
atauForeignKey
akan disimpan sepertiNULL
dalam DB.blank
menentukan apakah bidang akan diminta dalam bentuk. Ini termasuk admin dan formulir khusus Anda. Jikablank=True
maka bidang tidak akan diperlukan, sedangkan jikaFalse
bidang itu tidak boleh kosong.Kombo keduanya begitu sering karena biasanya jika Anda akan membiarkan bidang kosong di formulir Anda, Anda juga akan membutuhkan database Anda untuk memungkinkan
NULL
nilai untuk bidang itu. Pengecualian adalahCharField
s danTextField
s, yang dalam Django tidak pernah disimpan sebagaiNULL
. Nilai kosong disimpan dalam DB sebagai string kosong (''
).Beberapa contoh:
Jelas, kedua opsi itu tidak masuk akal secara logis untuk digunakan (meskipun mungkin ada kasus penggunaan karena
null=True, blank=False
jika Anda ingin bidang selalu diperlukan dalam bentuk, opsional ketika berurusan dengan objek melalui sesuatu seperti shell.)CHAR
danTEXT
tipe tidak pernah disimpanNULL
oleh Django, jadinull=True
tidak perlu. Namun, Anda dapat secara manual mengatur salah satu bidang iniNone
untuk memaksa mengaturnya sebagaiNULL
. Jika Anda memiliki skenario di mana itu mungkin diperlukan, Anda harus tetap memasukkannull=True
.sumber
IntegrityError
dinaikkan ketika Django mencoba untuk menyimpan catatan ke database. Field tidak perlu diisi oleh pengguna, dan itu masalahnya karena pada level database itu tidak nol.CHAR
danTEXT
TIDAK PERNAH diselamatkanNULL
oleh Django". Memang benar untuk sebagian besar backends, tetapi Oracle akan memaksa string kosong ke NULL, sehingga backend Django Oracle adalah pengecualian untuk pernyataan di atas Django DocsNone
dalam Python) jika Anda menetapkan null = True. The docs bahkan mengatakan untuk menghindari pengaturan nol = True karena memungkinkan dua macam nilai-nilai "Blanky". Saya baru saja menguji perilaku ini dengan Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?Ini adalah bagaimana peta
blank
&null
bidang ORM untuk Django 1.8Bidang basis data yang dibuat untuk PostgreSQL 9.4 adalah:
Bidang basis data yang dibuat untuk MySQL 5.6 adalah:
sumber
blank
tidak berpengaruh pada database, dannull
mengontrol apakah kolom database memungkinkanNULL
nilai. Jawaban ini sangat panjang untuk mengatakan itu, dan tidak memberikan informasi yang berguna tentangblank
.blank
dannull
harus tercermin dalam kolom database, padahal sebenarnyablank
hanya mempengaruhi penanganan Python, bukan kolom basis data. Yang lain bebas untuk memilih jika mereka merasa berguna; itu juga mungkin bagi orang-orang yang disesatkan oleh jawaban yang menyesatkan untuk berpikir itu berguna.Seperti yang dikatakan dalam referensi Bidang Model Django: Tautan
sumber
Sangat penting untuk memahami bahwa opsi dalam definisi bidang model Django melayani (setidaknya) dua tujuan: mendefinisikan tabel database, dan menentukan format default dan validasi formulir model. (Saya katakan "default" karena nilai selalu dapat ditimpa dengan memberikan formulir kustom.) Beberapa opsi mempengaruhi database, beberapa opsi mempengaruhi bentuk, dan beberapa mempengaruhi keduanya.
Ketika datang ke
null
danblank
, jawaban lain telah menjelaskan bahwa yang pertama mempengaruhi definisi tabel database dan yang terakhir mempengaruhi validasi model. Saya pikir perbedaan dapat dibuat lebih jelas dengan melihat use case untuk keempat konfigurasi yang mungkin:null=False
,blank=False
: Ini adalah konfigurasi default dan berarti bahwa nilai diperlukan dalam semua keadaan.null=True
,blank=True
: Ini berarti bahwa bidang ini opsional dalam semua keadaan. (Seperti yang disebutkan di bawah, meskipun, ini bukan cara yang disarankan untuk membuat bidang berbasis string opsional.)null=False
,blank=True
: Ini berarti bahwa formulir tidak memerlukan nilai tetapi database tidak. Ada beberapa kasus penggunaan untuk ini:Penggunaan yang paling umum adalah untuk bidang berbasis string opsional. Seperti dicatat dalam dokumentasi , idiom Django adalah menggunakan string kosong untuk menunjukkan nilai yang hilang. Jika
NULL
juga diizinkan, Anda akan berakhir dengan dua cara berbeda untuk menunjukkan nilai yang hilang.Situasi umum lainnya adalah Anda ingin menghitung satu bidang secara otomatis berdasarkan nilai yang lain (dalam
save()
metode Anda , katakanlah). Anda tidak ingin pengguna memberikan nilai dalam bentuk (karenanyablank=True
), tetapi Anda ingin agar database menegakkan bahwa nilai selalu diberikan (null=False
).Penggunaan lain adalah ketika Anda ingin menunjukkan bahwa a
ManyToManyField
adalah opsional. Karena bidang ini diimplementasikan sebagai tabel terpisah daripada kolom basis data,null
tidak ada artinya . Nilaiblank
akan tetap mempengaruhi formulir, meskipun, mengontrol apakah validasi akan berhasil atau tidak ketika tidak ada hubungan.null=True
,blank=False
: Ini berarti bahwa formulir membutuhkan nilai tetapi database tidak. Ini mungkin konfigurasi yang paling jarang digunakan, tetapi ada beberapa kasus penggunaan untuk itu:Sangat masuk akal untuk mengharuskan pengguna Anda untuk selalu memasukkan nilai bahkan jika itu sebenarnya tidak diperlukan oleh logika bisnis Anda. Bagaimanapun, formulir hanyalah satu cara untuk menambah dan mengedit data. Anda mungkin memiliki kode yang menghasilkan data yang tidak memerlukan validasi ketat yang sama seperti yang Anda inginkan dari editor manusia.
Kasus penggunaan lain yang pernah saya lihat adalah ketika Anda memiliki
ForeignKey
yang Anda tidak ingin membiarkan penghapusan kaskade . Artinya, dalam penggunaan normal relasi harus selalu ada di sana (blank=False
), tetapi jika hal yang ingin dihapus itu dihapus, Anda tidak ingin objek ini juga dihapus. Jika demikian, Anda dapat menggunakannull=True
danon_delete=models.SET_NULL
menerapkan penghapusan lunak sederhana .sumber
Anda mungkin memiliki jawaban Anda sampai hari ini sulit untuk menilai apakah menempatkan null = Benar atau kosong = Benar atau keduanya ke bidang. Saya pribadi berpikir itu sangat tidak berguna dan membingungkan untuk memberikan begitu banyak opsi kepada pengembang. Biarkan pegangan nol atau kosong seperti yang mereka inginkan.
Saya mengikuti tabel ini, dari Two Scoops of Django :
sumber
Cukup
null=True
mendefinisikan database harus menerimaNULL
nilai, di sisi lainblank=True
mendefinisikan validasi formulir, bidang ini harus menerima nilai kosong atau tidak (Jikablank=True
menerima formulir tanpa nilai di bidang itu danblank=False
[nilai default] pada validasi formulir, ini akan menampilkan bidang ini kesalahan yang diperlukan .null=True/False
terkait dengan basis datablank=True/False
terkait dengan validasi formulirsumber
Berikut adalah contoh bidang dengan
blank= True
dannull=True
description = models.TextField (blank = True, null = True)
Dalam hal ini::
blank = True
memberi tahu formulir kami bahwa tidak apa-apa membiarkan bidang deskripsi kosongdan
null = True
: memberi tahu basis data kami bahwa tidak apa-apa untuk merekam nilai nol di bidang db kami dan tidak memberikan kesalahan.sumber
Berarti tidak ada batasan database untuk bidang yang harus diisi, sehingga Anda dapat memiliki objek dengan nilai nol untuk diisi yang memiliki opsi ini.
Berarti tidak ada kendala validasi dalam bentuk Django. jadi ketika Anda mengisi
modelForm
untuk model ini, Anda dapat meninggalkan bidang dengan opsi ini tidak terisi.sumber
Di sini, adalah perbedaan utama
null=True
danblank=True
:Nilai default keduanya
null
danblank
False. Kedua nilai ini bekerja di level lapangan yaitu, apakah kita ingin menyimpan fieldnull
ataublank
.null=True
akan menetapkan nilai bidang keNULL
yaitu, tidak ada data. Ini pada dasarnya untuk nilai kolom database.blank=True
menentukan apakah bidang akan diminta dalam bentuk. Ini termasuk admin dan formulir kustom Anda sendiri.title = models.CharField(blank=True) // title can be kept blank.
Dalam database("")
akan disimpan.null=True
blank=True
Ini berarti bahwa bidang ini opsional dalam semua keadaan.sumber
Nilai default nol dan kosong adalah False.
Null: Ini terkait database. Menentukan apakah kolom basis data yang diberikan akan menerima nilai nol atau tidak.
Kosong: Ini terkait dengan validasi. Ini akan digunakan selama validasi formulir, saat memanggil form.is_valid ().
Yang sedang berkata, itu baik-baik saja untuk memiliki bidang dengan nol = Benar dan kosong = Salah. Berarti pada level database, field tersebut bisa NULL, tetapi pada level aplikasi itu adalah bidang yang wajib diisi.
Sekarang, di mana sebagian besar pengembang salah: Menentukan null = True untuk bidang berbasis string seperti CharField dan TextField. Hindari melakukan itu. Jika tidak, Anda akan memiliki dua kemungkinan nilai untuk "tidak ada data", yaitu: Tidak ada dan string kosong. Memiliki dua nilai yang mungkin untuk "tidak ada data" adalah berlebihan. Konvensi Django adalah menggunakan string kosong, bukan NULL.
sumber
Ketika kami menyimpan apa pun di admin Django, dua langkah validasi terjadi, pada level Django dan pada tingkat Database. Kami tidak dapat menyimpan teks dalam bidang angka.
Basis data memiliki tipe data NULL, bukan apa-apa. Ketika Django membuat kolom dalam database itu menentukan bahwa mereka tidak boleh kosong. Dan jika Anda akan mencoba untuk menyimpan NULL Anda akan mendapatkan kesalahan basis data.
Juga pada tingkat Django-Admin, semua bidang wajib diisi secara default, Anda tidak dapat menyimpan bidang kosong, Django akan membuat Anda mengalami kesalahan.
Jadi, jika Anda ingin menyimpan bidang kosong Anda harus mengizinkannya pada tingkat Django dan Database. blank = True - akan mengizinkan bidang kosong di panel admin null = True - akan memungkinkan penyimpanan NULL ke kolom database.
sumber
Ada satu titik di mana
null=True
akan diperlukan bahkan padaCharField
atauTextField
dan saat itulah database memilikiunique
menetapkan bendera untuk kolom.Dengan kata lain, jika Anda memiliki Char / TextField unik di Django, Anda harus menggunakan ini:
Untuk CharField atau TextField yang tidak unik, Anda akan lebih baik melewatkan bagian-bagian
null=True
lain yang akan ditetapkan sebagai NULL sementara yang lain sebagai "", dan Anda harus memeriksa nilai bidang untuk NULL setiap kali.sumber
null untuk database dan kosong untuk validasi bidang yang ingin Anda tampilkan di antarmuka pengguna seperti bidang teks untuk mendapatkan nama belakang orang. Jika nama belakang = models.charfield (blank = true) itu tidak meminta pengguna untuk memasukkan nama belakang karena ini adalah bidang opsional sekarang. Jika nama belakang = models.charfield (null = true) maka itu berarti jika bidang ini tidak mendapatkan nilai dari pengguna maka itu akan disimpan dalam database sebagai string kosong "".
sumber
Arti dari null = True dan blank = True dalam model juga tergantung pada bagaimana bidang-bidang ini didefinisikan dalam kelas bentuk.
Misalkan Anda telah mendefinisikan kelas berikut:
Jika kelas bentuk telah didefinisikan seperti ini:
Kemudian, bidang 'nama' tidak akan wajib (karena kosong = Benar dalam model) dan bidang 'alamat' akan wajib (karena kosong = Salah dalam model).
Namun, jika kelas ClientForm telah didefinisikan seperti ini:
Kemudian, kedua bidang ('nama' dan 'alamat') akan wajib, "karena bidang yang didefinisikan secara deklaratif dibiarkan apa adanya" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) , yaitu standar untuk atribut 'wajib' dari bidang formulir adalah Benar dan ini akan mengharuskan bidang 'nama' dan 'alamat' diisi, bahkan jika, dalam model, bidang telah disetel ke kosong = Benar.
sumber
null - default adalah False if True, Django akan menyimpan kosong sebagai null dalam database.
blank - default adalah False jika benar bidang itu dibiarkan kosong
lebih lanjut, goto https://docs.djangoproject.com/en/3.0/topics/db/models/
sumber
Tabel di bawah ini menunjukkan perbedaan utama:
sumber
Dengan kata-kata yang sangat sederhana ,
Kosong berbeda dari nol.
nol adalah murni database yang terkait , sedangkan kosong adalah validasi terkait (diperlukan dalam bentuk) .
Jika
null=True
, Django akan melakukannyastore empty values as NULL in the database
. Jika suatu bidang memilikiblank=True
, validasi formulir akanallow entry of an empty value
. Jika bidang kosong = Salah, bidang wajib diisi.sumber