49

私の Django モデル内で、次のような 10 進数フィールドを作成しました。

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)

明らかに、価格がマイナスまたはゼロであることは意味がありません。10 進数を正の数だけに制限する方法はありますか?

または、フォーム検証を使用してこれをキャプチャする必要がありますか?

4

6 に答える 6

92

を使用しMinValueValidatorます。

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])
于 2012-09-12T08:59:45.390 に答える
2

次のようなことができます:

# .....
class priceForm(ModelForm):
    price = forms.DecimalField(required=False, max_digits=6, min_value=0)

これは、'price' のバリデータ値にも関与します。

于 2016-09-28T15:48:26.023 に答える
1

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()ます。

于 2019-10-21T14:16:45.673 に答える