限制Django FloatField到2位小数

43 投票
3 回答
71165 浏览
提问于 2025-04-18 06:59

我想知道怎么在Django中把FloatField限制为只有两位小数。有没有人知道怎么做到这一点,而不需要使用DecimalField

我试过用decimal_places=2,但是这导致了浮点字段的迁移错误。所以我在想,这个方法可能只适用于DecimalFields。

3 个回答

2

从Django 1.8版本开始,你可以为FloatField或者任何模型字段使用自定义的验证器:

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])
23

如果你想确保你的模型在保存时总是只保留两位小数,而不是仅仅在模板中改变显示方式,那么在你的模型上自定义一个保存方法会非常有效。下面的示例模型就展示了怎么做。

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)

现在,每次你保存模型时,都能保证这个字段只会保存两位小数的浮点数。这个方法也可以扩展到四舍五入到任意位数的小数。

81

如果你只关心你的 FloatField 在表单中是怎么显示的,你可以使用一个叫做 floatformat 的模板过滤器。

根据Django文档的说明:

如果你给它传一个数字作为参数,floatformat 会把数字四舍五入到指定的小数位数。

举个例子,如果值是 34.23234,那么在你的模板中:

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

撰写回答