限制 Django 的 FloatField 为两位小数

40
我正在寻找一种方法来限制Django中的FloatField只保留2位小数。有人知道如何做到这一点而不使用DecimalField吗?
我尝试了decimal_places=2,但这只给了我一个在float字段中的迁移错误。所以,我认为这个方法只能在DecimalFields中起作用。

1
为什么你不想使用DecimalField - alecxe
你尝试过这样写吗?models.FloatField(default=to_some_value) - ajknzhol
因为十进制字段在输入框中添加了增量和减量箭头,而我不希望它们出现。我还没有尝试默认方法,但会查看一下是否适合我的需求。 - Aidan Doherty
1
@AidanDoherty,所以原因就是它在表单上的显示方式吗?你知道 - 你可以通过为该字段设置不同的小部件来更改它。 - alecxe
@alecxe 那我是不是可以通过覆盖 Decimal Field widget 来更改它的类型值呢? - Aidan Doherty
您可以参考此链接获取有关Django小部件的更多信息。https://docs.djangoproject.com/en/dev/ref/forms/widgets/ - Rod Xavier
3个回答

79

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

Django文档中写道:

如果与一个整数参数一起使用,floatformat 将数字四舍五入到小数点后几位。

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

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

这很不错,但并不完全是我要找的,不过我相信这将在未来的项目中派上用场,感谢你的帮助。 - Aidan Doherty
这很有帮助。我正在使用 Django 中的 Postgres FloatField(default=0.00),但保存时会删除小数位中无用的 0,这是有道理的... 但我想在模板中显示一致的值 0.005.43... {{ value|floatformat:2 }} 就解决了问题。 - Lal
1
请查看我的答案,以确保您的数据字段始终在数据库级别四舍五入到两位小数。 - user1847
1
如何在 Django 的 ModelForm 实例中使用它? - Mohammed Shareef C

22

如果你希望确保你的模型总是只保存两位小数,而不仅仅是在模板中更改模型的呈现方式,那么在你的模型上使用自定义保存方法会非常有效。下面是一个示例模型。

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)

现在每次保存模型时,您将确保该字段仅填充两位小数的浮点数。这可以推广到舍入到任意位小数。


1
如果您在查询集上调用“update”方法,则不会执行此“save”方法。 - Mohammed Shareef C
2
表示并不等同于实际值。通过四舍五入值,你会牺牲精度。 - Domenico Spidy Tamburro

2
自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])

这样做是行不通的。验证器不会改变被保存的值,它们只验证一个值是否可接受。如果该值不可接受,则应引发异常。这不会修改正在保存的值。 - user1847
请看下面的答案,它可以确保浮点字段四舍五入到两位小数。 - user1847

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接