繁体   English   中英

只允许正十进制数

[英]Allow only positive decimal numbers

在我的 Django 模型中,我创建了一个像这样的小数字段:

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

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

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

使用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)

这也负责“价格”的验证器值。

在 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()上收到数据库完整性错误。

  1. 导入依赖
from decimal import Decimal
from django.core.validators import MinValueValidator
  1. 添加验证器
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM