只允许正十进制数

时间:2012-09-12 08:52:51

标签: python django

在我的Django模型中,我创建了一个十进制字段,如下所示:

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

显然,价格为负或零是没有意义的。有没有办法将十进制数限制为只有正数?

或者我是否必须使用表单验证来捕获它?

5 个答案:

答案 0 :(得分:63)

使用MinValueValidator

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'),
        ]

Note:

  

约束验证

     

通常,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'),
        ]