私の Django モデル内で、次のような 10 進数フィールドを作成しました。
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)
明らかに、価格がマイナスまたはゼロであることは意味がありません。10 進数を正の数だけに制限する方法はありますか?
または、フォーム検証を使用してこれをキャプチャする必要がありますか?
を使用しMinValueValidator
ます。
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])
次のようなことができます:
# .....
class priceForm(ModelForm):
price = forms.DecimalField(required=False, max_digits=6, min_value=0)
これは、'price' のバリデータ値にも関与します。
Django 2.2では、データベース テーブルの制約として移行に適用される制約をモデルに追加できます。
from decimal import Decimal
from django.db import models
class Item(models.Model):
price = models.DecimalField( _(u'Price'), decimal_places=2, max_digits=12 )
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(price__gt=Decimal('0')), name='price_gt_0'),
]
制約の検証
一般に、制約は の間
full_clean()
にチェックされず、発生しませんValidationErrors
。むしろ、データベースの整合性エラーが発生しsave()
ます。