[英]Allow only positive decimal numbers
在我的 Django 模型中,我创建了一个像这样的小数字段:
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)
显然,价格为负或零是没有意义的。 有没有办法将十进制数限制为正数?
或者我是否必须使用表单验证来捕获它?
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)
这也负责“价格”的验证器值。
在 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()
上收到数据库完整性错误。
from decimal import Decimal
from django.core.validators import MinValueValidator
price = models.DecimalField(
decimal_places=2,
max_digits=12,
validators=[MinValueValidator(Decimal('0.01'))]
)
根据文档,似乎没有办法在字段上放置诸如数据库约束之类的东西。 您能做的最好的事情是添加模型“验证器”,如果您调用模型验证或使用ModelForm
,它将被调用。 如果您只是将值放入对象和save()
则会跳过验证器。
因此,您可以在表单上添加验证,或者您可以向模型添加验证,如果您使用ModelForm
,它也会在表单级别运行。
有关 验证器如何在表单中运行的更多信息,请参阅 表单验证,以及验证对象如何在模型中运行。 请注意,当您保存模型时,验证器不会自动运行,但如果您使用的是
ModelForm
,它将在表单中包含的任何字段上运行您的验证器。 有关模型验证如何与表单交互的信息,请参阅ModelForm 文档。
假设这是您的产品型号,并且您想在价格字段上添加非负约束。 您可以在模型上添加元约束:
class Product(models.Model):
price = models.DecimalField(max_digits=13, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
managed = True
db_table = 'product'
constraints = [
models.CheckConstraint(check=models.Q(price__gte='0'), name='product_price_non_negative'),
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.