将Django FloatField限制为2个小数位

2024-09-25 08:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法,将Django中的FloatField限制为2个小数位,如果有人知道如何在不使用DecimalField的情况下完成这项工作。

我试过decimal_places=2但是这只是给了我一个在float字段中的迁移错误,所以我认为这个方法只能在DecimalFields中工作。


Tags: django方法错误情况floatdecimalplaces小数位
3条回答

如果您希望实际确保模型始终只保存两位小数,而不只是更改模板中模型的表示形式,那么模型上的自定义保存方法将非常有用。下面的示例模型演示了如何。

class MyDataModel(models.Model):
    my_float = models.FloatField()

    def save(self, *args, **kwargs):
        self.my_float = round(self.my_float, 2)
        super(MyDataModel, self).save(*args, **kwargs)

现在,每次保存模型时,您将确保该字段将只填充两位小数。这可以概括为四舍五入到任意小数位数。

如果只关心FloatField在表单中的显示方式,则可以使用模板过滤器^{}

来自Django文档:

If used with a numeric integer argument, floatformat rounds a number to that many decimal places.

例如,如果value=34.23234,则在模板中:

{{ value|floatformat:2 }}  # outputs 34.23

由于Django 1.8+您可以为FloatField/或任何ModelFields使用自定义验证器:

def validate_decimals(value):
    try:
        return round(float(value), 2)
    except:
        raise ValidationError(
            _('%(value)s is not an integer or a float  number'),
            params={'value': value},
        )

……在您的模型中,您可以这样应用它:

from django.db import models

class MyModel(models.Model):
    even_field = models.FloatField(validators=[validate_decimals])

相关问题 更多 >