Saya tidak berpikir Anda memerlukan bantuan untuk memperbaiki masalah ini, sama seperti Anda membutuhkan bantuan untuk men-debug-nya. Setelah masalahnya jelas, solusinya juga tampak jelas. Traceback mungkin agak tidak jelas karena melewati begitu banyak kode sumber Django dan tidak memberitahu Anda bidang mana yang mengalami masalah.
Latar Belakang Masalah Ini
Untuk memulainya, kami mengalami masalah saat menyimpan Post
contoh. Nah, lihat semua bidang ini yang Anda miliki dalam definisi model Anda:
...
url = models.URLField(max_length=250, blank=True, null=True)
video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True)
content = RichTextUploadingField(config_name='default')
image = models.ImageField(upload_to='images',blank=True, null=True)
thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
Ini mungkin tidak terlihat seperti bidang teks, tetapi banyak di antaranya adalah variasi pada bidang teks karena, jika Anda memikirkannya, Anda mungkin tidak akan menyimpan seluruh file dalam basis data Anda. Apa yang akan anda lakukan sebagai gantinya (dan apa yang Django lakukan secara default) adalah menyimpan file di suatu tempat pada beberapa disk dan kemudian dalam database anda akan menyimpan path ke file itu sehingga Anda dapat mengambilnya kembali saat Anda membutuhkannya.
Selanjutnya, mungkin sia-sia untuk menyimpan jalur file di db sebagai LongText
atau apa pun, jadi setiap FileField
kami memiliki berarti kami memiliki bidang dengan max_length
apakah kita menentukannya atau tidak. Jadi, semua bidang di atas memiliki max_length
implicit implisit . Anda sebenarnya dapat menemukan ini dengan membaca kode sumber Django.
Contoh Sumber
Saya tidak pernah menggunakan EmbedVideoField
, misalnya, tetapi ternyata subkelas dari models.URLField
, yang berarti memiliki max_length
secara default setel ke 200 jika Anda tidak menentukannya.
Selain itu, berbagai ImageField
. Anda s hanyalah subkelas dari FileField
, yang memiliki max_length
default 100
.
Bagaimana Cara Men-debug Masalah Seperti Ini Di Masa Depan?
Sekarang, ini tidak membantu kita untuk mengetahui yang mana bidang Anda membuat kesalahan dalam kasus ini. Untuk itu, saya mungkin akan menetapkan breakpoint di suatu tempat dalam kode, mungkin di sini:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Dengan "menetapkan breakpoint", maksud saya sebagai berikut:
Pergi ke baris 65 dalam modul yang disebutkan di atas, ebagu/main/models.py
dan masukkan berikut ini dan simpan modul:import pdb; pdb.set_trace()
(Saya sebenarnya memiliki preferensi yang kuat untuk ipdb sendiri, tetapi itu membutuhkan Ipython, yang juga saya sukai ...)
Jalankan server lokal Anda, dan jalankan melalui langkah-langkah yang menghasilkan masalah ini. Anda akhirnya akan mengirimkan formulir Anda dan jika Anda melihat konsol tempat Anda memulai server Anda, Anda akhirnya akan dibuang ke shell tepat di baris 65. Shell ini adalah kulit pdb
, yang memiliki aturan berbeda dari shell biasa, tetapi Anda dapat mengevaluasi Post
yang akan disimpan misalnya, dengan melihat berbagai bidang pada instance itu sendiri, self
, dan menjalankan kode Python dalam konteks pemanggilan metode tersebut:
(pdb) len(self.image.path)
Dengan menggunakan itu, saya akan secara manual mengevaluasi berbagai bidang dan melihat mana yang memiliki entri yang sangat panjang ini yang mencekik penyimpanan (mungkin salah satu dari ImageField
Anda s).
Solusi dengan Peringatan
Sebagai alternatif, Anda bisa menambahkan max_length
untuk semua ini, tetapi diperingatkan bahwa kemungkinan besar Anda perlu melakukan migrasi basis data untuk setiap bidang teks terbatas yang Anda ubah karena database Anda masih akan memverifikasi panjang input terhadap bagaimana kolom didefinisikan. Inilah jawaban StackOverflow yang bagus untuk melihat masalah ini
.
Catatan kaki
Mengapa ini tidak muncul sebelum Anda beralih ke Postgresql? Ada berbagai alasan potensial, tetapi mungkin ada hubungannya dengan bagaimana basis data sebelumnya disetel vs bagaimana basis data Postgresql disetel (secara manual vs migrasi Django?).
Mungkin juga ada hubungannya dengan apakah Anda mengubah tempat penyimpanan barang-barang ini atau tidak. Apakah Anda mengubah MEDIA
pengaturan sehingga jalur tempat file disimpan menjadi lebih lama?
Apa yang Anda benar-benar harus lakukan adalah melihat langsung ke database Anda. Buka psql
contoh dan minta untuk menggambarkan tabel Anda untuk Anda. Ini akan memberi tahu Anda bidang mana yang dibatasi hingga 100 karakter dan itu adalah bidang yang memberi Anda masalah.