在我的Django模型中,我创建了一个十进制字段,如下所示:
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)
显然,价格为负或零是没有意义的。有没有办法将十进制数限制为只有正数?
或者我是否必须使用表单验证来捕获它?
答案 0 :(得分:63)
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])
答案 1 :(得分:1)
你可以这样做:
# .....
class priceForm(ModelForm):
price = forms.DecimalField(required=False, max_digits=6, min_value=0)
这也是对价格'
的验证者价值的责任答案 2 :(得分:0)
根据文档,似乎没有办法在字段上放置类似数据库约束的东西。您可以做的最好的事情是添加模型"验证器"如果您调用模型验证或使用ModelForm
,将调用它。如果只是将值放入对象save()
中,则会跳过验证器。
因此,您可以在表单上添加验证,或者您可以向模型添加验证,如果您使用ModelForm
,也可以在表单级别运行验证。
来自docs on "How validators are run":
有关如何运行验证程序的详细信息,请参阅form validation 在表单中,Validating objects表示它们在模型中的运行方式。注意 保存模型时,验证程序不会自动运行, 但是如果您使用
ModelForm
,它将在任何上运行您的验证器 表单中包含的字段。查看ModelForm documentation 有关模型验证如何与表单交互的信息。
答案 3 :(得分:0)
在Django 2.2中,您可以add constraints to a model将其作为对数据库表的约束应用于迁移:
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()
上收到数据库完整性错误。
答案 4 :(得分:0)
假设这是您的产品型号,并且您想在价格字段上添加非负约束。您可以在模型上添加元约束:
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'),
]