Saya hanya ingin tahu apakah ada yang tahu jika ada alasan bagus mengapa django orm tidak memanggil 'full_clean' pada model kecuali disimpan sebagai bagian dari model form.
Perhatikan bahwa full_clean () tidak akan dipanggil secara otomatis ketika Anda memanggil metode save () model Anda. Anda harus menyebutnya secara manual saat Anda ingin menjalankan validasi model satu langkah untuk model yang Anda buat sendiri. django doc lengkap bersih
(CATATAN: kutipan diperbarui untuk Django 1.6 ... dokumen Django sebelumnya memiliki peringatan tentang ModelForms juga.)
Adakah alasan bagus mengapa orang tidak menginginkan perilaku ini? Saya pikir jika Anda meluangkan waktu untuk menambahkan validasi ke model, Anda ingin validasi dijalankan setiap kali model disimpan.
Saya tahu bagaimana agar semuanya berjalan dengan baik, saya hanya mencari penjelasan.
pre_save
kait dan lakukanfull_clean
pada semua model yang tertangkap.Jawaban:
AFAIK, ini karena kompatibilitas ke belakang. Ada juga masalah dengan ModelForms dengan bidang yang dikecualikan, model dengan nilai default, sinyal pre_save (), dll.
Sumber tempat Anda tertarik:
sumber
Karena pertimbangan kompatibilitas, pembersihan otomatis saat penyimpanan tidak diaktifkan di django kernel.
Jika kita memulai proyek baru dan ingin
save
metode default pada Model dapat membersihkan secara otomatis, kita dapat menggunakan sinyal berikut untuk melakukan pembersihan sebelum setiap model disimpan.sumber
if send == somemodel, then exclude some fields
dipre_save_handler
ValidationError: Session with this Session key already exists
. Untuk menghindari hal ini, Anda perlu menambahkan pernyataan if untuksender in list_of_model_classes
mencegah sinyal mengesampingkan model autentikasi default Django. Tetapkanlist_of_model_classes
bagaimana pun yang Anda pilihCara paling sederhana untuk memanggil
full_clean
metode adalah dengan menggantisave
metode dimodel
:sumber
Alih-alih menyisipkan sepotong kode yang menyatakan penerima, kita dapat menggunakan aplikasi sebagai
INSTALLED_APPS
bagian dalamsettings.py
Sebelum itu, Anda mungkin perlu menginstal
django-fullclean
menggunakan PyPI:sumber
pip install
beberapa aplikasi dengan 4 baris kode di dalamnya (periksa kode sumber ) daripada menulis sendiri baris ini?Jika Anda memiliki model yang ingin Anda pastikan memiliki setidaknya satu hubungan FK, dan Anda tidak ingin menggunakan
null=False
karena itu memerlukan pengaturan default FK (yang akan menjadi data sampah), cara terbaik yang saya buat adalah untuk menambahkan kustom.clean()
dan.save()
metode..clean()
memunculkan kesalahan validasi, dan.save()
memanggil clean. Dengan cara ini integritas ditegakkan baik dari formulir dan dari kode panggilan lain, baris perintah, dan tes. Tanpa ini, ada (AFAICT) tidak ada cara untuk menulis tes yang memastikan bahwa model memiliki hubungan FK dengan model lain yang dipilih secara spesifik (bukan default).sumber
Mengomentari @Alfred jawaban Huang dan setuju. Seseorang mungkin mengunci kait pre_save ke aplikasi dengan mendefinisikan daftar kelas dalam modul saat ini (models.py) dan memeriksa di kait pre_save:
sumber