Django memiliki berbagai bidang numerik yang tersedia untuk digunakan dalam model, misalnya DecimalField dan PositiveIntegerField . Meskipun yang pertama dapat dibatasi pada jumlah tempat desimal yang disimpan dan jumlah keseluruhan karakter yang disimpan, adakah cara untuk membatasinya agar hanya menyimpan angka dalam rentang tertentu, misalnya 0,0-5,0?
Gagal, apakah ada cara untuk membatasi PositiveIntegerField hanya menyimpan, misalnya, nomor hingga 50?
Pembaruan: sekarang Bug 6845 telah ditutup , pertanyaan StackOverflow ini mungkin dapat diperdebatkan. - sampablokuper
python
django
django-models
numbers
sampablokuper
sumber
sumber
Jawaban:
Anda juga dapat membuat jenis bidang model khusus - lihat http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Dalam hal ini, Anda bisa 'mewarisi' dari IntegerField bawaan dan mengganti logika validasinya.
Semakin saya memikirkan hal ini, saya menyadari betapa berharganya hal ini bagi banyak aplikasi Django. Mungkin tipe IntegerRangeField dapat dikirimkan sebagai tambalan untuk pengembang Django untuk dipertimbangkan menambah trunk.
Ini bekerja untuk saya:
Kemudian di kelas model Anda, Anda akan menggunakannya seperti ini (bidang menjadi modul tempat Anda meletakkan kode di atas):
ATAU untuk rentang negatif dan positif (seperti rentang osilator):
Apa yang akan sangat keren adalah jika bisa dipanggil dengan operator jarak seperti ini:
Tapi, itu akan membutuhkan lebih banyak kode karena sejak Anda dapat menentukan parameter 'lewati' - rentang (1, 50, 2) - Namun, ide yang menarik ...
sumber
MinValueValidator(min_value) and MaxValueValidator(max_value)
sebelum meneleponsuper().__init__ ...
(snippet: gist.github.com/madneon/147159f46ed478c71d5ee4950a9d697d )Anda dapat menggunakan validator bawaan Django -
Sunting : Saat bekerja langsung dengan model, pastikan untuk memanggil metode model full_clean sebelum menyimpan model untuk memicu validator. Ini tidak diperlukan saat menggunakan
ModelForm
karena formulir akan melakukannya secara otomatis.sumber
null=True
danblank=True
berfungsi seperti yang diharapkan. Bidang ini opsional dan jika dibiarkan kosong itu disimpan sebagai nol.sumber
Saya memiliki masalah yang sama; inilah solusi saya:
sumber
models.IntegerField(choices=[(i, i) for i in range(1, n)], blank=True)
Ada dua cara untuk melakukan ini. Salah satunya adalah menggunakan validasi formulir untuk tidak pernah membiarkan nomor lebih dari 50 dimasukkan oleh pengguna. Formulir dokumen validasi .
Jika tidak ada pengguna yang terlibat dalam proses, atau Anda tidak menggunakan formulir untuk memasukkan data, maka Anda harus mengganti metode model
save
untuk membuang pengecualian atau membatasi data yang masuk ke bidang.sumber
Berikut adalah solusi terbaik jika Anda ingin fleksibilitas ekstra dan tidak ingin mengubah bidang model Anda. Cukup tambahkan validator khusus ini:
Dan itu bisa digunakan seperti itu:
Dua parameter adalah maks dan min, dan memungkinkan nol. Anda dapat menyesuaikan validator jika Anda suka dengan menghilangkan pernyataan jika ditandai atau mengubah bidang Anda menjadi kosong = Salah, null = Salah dalam model. Tentu saja itu membutuhkan migrasi.
Catatan: Saya harus menambahkan validator karena Django tidak memvalidasi rentang pada PositiveSmallIntegerField, sebagai gantinya itu menciptakan smallint (dalam postgres) untuk bidang ini dan Anda mendapatkan kesalahan DB jika angka yang ditentukan di luar kisaran.
Semoga ini bisa membantu :) Lebih lanjut tentang Validator di Django .
PS. Saya mendasarkan jawaban saya pada BaseValidator di django.core.validators, tetapi semuanya berbeda kecuali untuk kode.
sumber