Petunjuk dari supervisor saya: "Saya ingin menghindari menempatkan logika apa pun di models.py
. Mulai saat ini, mari kita gunakan itu hanya sebagai kelas untuk mengakses database, dan menyimpan semua logika di kelas eksternal yang menggunakan kelas model, atau membungkusnya."
Saya merasa ini adalah cara yang salah untuk pergi. Saya merasa bahwa menjaga logika dari model hanya untuk menjaga file tetap kecil adalah ide yang buruk. Jika logikanya paling baik dalam modelnya, di situlah logika harus digunakan terlepas dari ukuran file.
Jadi apakah ada cara sederhana untuk hanya menggunakan include? Dalam bahasa PHP, saya ingin mengusulkan kepada supervisor bahwa kita baru saja models.py
menyertakan () kelas model dari tempat lain. Secara konseptual, ini akan memungkinkan model untuk memiliki semua logika yang kita inginkan, namun tetap memperkecil ukuran file melalui peningkatan jumlah file (yang menyebabkan lebih sedikit masalah kontrol revisi seperti konflik, dll.).
Jadi, apakah ada cara sederhana untuk menghapus kelas model dari berkas models.py, tapi masih mempunyai model bekerja dengan semua perkakas Django? Atau, apakah ada solusi yang benar-benar berbeda namun elegan untuk masalah umum file "large" models.py? Setiap masukan akan kami hargai.
sumber
Jawaban:
Django dirancang untuk membiarkan Anda membangun banyak aplikasi kecil daripada satu aplikasi besar.
Di dalam setiap aplikasi besar ada banyak aplikasi kecil yang berjuang untuk menjadi gratis.
Jika Anda
models.py
merasa besar, Anda melakukan terlalu banyak. Berhenti. Bersantai. Membusuk.Temukan komponen atau bagian aplikasi kecil yang lebih kecil dan berpotensi dapat digunakan kembali. Anda tidak harus benar - benar menggunakannya kembali. Anggap saja mereka berpotensi dapat digunakan kembali.
Pertimbangkan jalur peningkatan Anda dan dekomposisi aplikasi yang mungkin ingin Anda ganti suatu hari nanti. Anda tidak harus benar - benar menggantinya, tetapi Anda dapat menganggapnya sebagai "modul" pemrograman yang berdiri sendiri yang mungkin akan diganti dengan sesuatu yang lebih keren di masa mendatang.
Kami memiliki sekitar selusin aplikasi, masing
model.py
- masing tidak lebih dari 400 baris kode. Mereka semua cukup fokus pada kurang dari setengah lusin definisi kelas yang berbeda. (Ini bukan batasan yang sulit, ini adalah pengamatan tentang kode kita.)Kami membusuk lebih awal dan sering.
sumber
Wajar jika kelas model berisi metode untuk beroperasi pada model. Jika saya memiliki model Buku, dengan metode
book.get_noun_count()
, di situlah tempatnya - saya tidak ingin menulis "get_noun_count(book)
", kecuali metode tersebut secara intrinsik dimiliki oleh beberapa paket lain. (Mungkin - misalnya, jika saya memiliki paket untuk mengakses API Amazon dengan "get_amazon_product_id(book)
".)Saya merasa ngeri ketika dokumentasi Django menyarankan untuk meletakkan model dalam satu berkas, dan saya mengambil beberapa menit dari awal untuk mencari tahu bagaimana membaginya menjadi sub-paket yang tepat.
__init__.py
seperti:from .book import Book
jadi saya masih bisa menulis "dari site.models import Book".
Trik satu-satunya adalah Anda perlu secara eksplisit menyetel aplikasi setiap model, karena adanya bug di Django: ini mengasumsikan bahwa nama aplikasi adalah entri ketiga hingga terakhir di jalur model. "site.models.Book" menghasilkan "situs", yang benar; "site.models.book.Book" membuatnya mengira nama aplikasi adalah "model". Ini adalah retasan yang cukup buruk di pihak Django; itu mungkin harus mencari daftar aplikasi yang diinstal untuk pencocokan awalan.
class Book(models.Model): class Meta: app_label = "site"
Anda mungkin bisa menggunakan kelas dasar atau metaclass untuk menggeneralisasi ini, tapi saya belum mempedulikannya.
sumber
Saya tidak mengerti dari banyak kemungkinan masalah yang mungkin Anda miliki. Berikut beberapa kemungkinan dengan jawaban:
beberapa model dalam file yang sama
Masukkan ke dalam file terpisah. Jika ada dependensi, gunakan import untuk menarik model tambahan.
logika asing / fungsi utilitas di models.py
Letakkan logika ekstra ke dalam file terpisah.
metode statis untuk memilih beberapa contoh model dari database
Buat Manajer baru di file terpisah.
metode jelas terkait dengan model
simpan, __unicode__ dan get_absolute_url adalah contohnya.
sumber