限制django浮点字段为2位小数

at0kjp5o  于 2023-01-03  发布在  Go
关注(0)|答案(3)|浏览(561)

我正在寻找一种方法来限制在Django的浮点域到2个小数位,有没有人得到一个线索,这可以做到,而不必使用十进制域。
我尝试了decimal_places=2,但这只是给了我一个浮点字段内的迁移错误,所以我认为这个方法只能在DecimalFields内工作。

ht4b089n

ht4b089n1#

如果您只关心FloatField在表单中的显示方式,可以使用模板过滤器floatformat
来自Django文档:
如果与数字整型参数一起使用,floatformat会将数字四舍五入到小数位数。
例如,如果value = 34.23234,则在模板中:

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

bis0qfac2#

如果你真的想确保你的模型保存时只保留两位小数,而不仅仅是改变模板中模型的显示方式,那么在你的模型上定制一个保存方法会很好。下面的示例模型展示了如何实现。

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)

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

s8vozzvw

s8vozzvw3#

从Django 1.8+开始,你可以为FloatField/或任何ModelField使用自定义验证器:

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

相关问题