将 django FloatField 限制为 2 位小数
Posted
技术标签:
【中文标题】将 django FloatField 限制为 2 位小数【英文标题】:Restrict django FloatField to 2 decimal places 【发布时间】:2014-07-07 11:44:21 【问题描述】:我正在寻找一种将 Django 中的 FloatField 限制为小数点后 2 位的方法,有没有人知道如何在不使用 DecimalField 的情况下做到这一点。
我尝试了decimal_places=2
,但这只是在浮点字段中给了我一个迁移错误,所以我认为这种方法只能在 DecimalFields 中工作。
【问题讨论】:
你为什么不想使用DecimalField
?
你试过这个models.FloatField(default=to_some_value)
因为十进制字段在输入框中添加了递增和递减箭头,我不希望出现这种情况,我没有尝试过默认方法,但会查找它,看看它是否适合我需要的东西。
@AidanDoherty 那么,原因是它在表单上的显示方式是什么?您知道 - 您可以通过为该字段设置不同的小部件来更改它。
@alecxe 所以我会通过覆盖十进制字段小部件来更改其类型值来做到这一点?。
【参考方案1】:
如果您只关心FloatField
在表单中的显示方式,您可以使用模板过滤器floatformat
。
来自 Django 文档:
如果与数字整数参数一起使用,floatformat 会将数字四舍五入到小数位数。
例如,如果 value = 34.23234,那么在您的模板中:
value|floatformat:2 # outputs 34.23
【讨论】:
这很好,但并不完全是我想要的,但我相信这将在未来的项目中派上用场,感谢您的帮助。 这有帮助。我正在将 Postgres 与 DjangoFloatField(default=0.00)
一起使用,但它通过删除小数位无用的 0s
将其保存为 0
.. 这是有道理的.. 但我想在模板中显示一致的值 0.00
或 5.43
。 .. value|floatformat:2
成功了
查看我的answer,以确保您的数据字段在数据库级别始终四舍五入到小数点后两位。
如何将它与 django ModelForm 实例一起使用?【参考方案2】:
如果您确实想确保您的模型始终只保留两位小数,而不是仅仅更改模型在模板中的表示,那么您的模型上的自定义保存方法将非常有用。下面的示例模型显示了如何。
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)
现在,每次保存模型时,您都将保证该字段只会填充两位小数的浮点数。这可以概括为四舍五入到任何小数位。
【讨论】:
如果您在查询集上调用update
方法,则不会执行此save
方法。【参考方案3】:
从 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])
【讨论】:
这行不通。验证器不会更改正在保存的值,它们仅验证值是否可接受。如果该值不可接受,则应引发异常。这不会修改正在保存的值。 请参阅下面的答案以获取确保浮点字段四舍五入到小数点后两位的答案。以上是关于将 django FloatField 限制为 2 位小数的主要内容,如果未能解决你的问题,请参考以下文章