使用DecimalField以正确的精度显示

时间:2013-03-24 12:29:36

标签: django django-models

在我的数据库中,我有一个我想用来存储学分的字段。积分是0.5的倍数,所以例如一个人可以有1,1.5或100等

我是否在数据库中为此选择了正确的字段?....

 models.DecimalField(max_digits=10, decimal_places=5,
                                      null=True, blank=True)

同时在显示余额时,我会执行以下操作....

 def _balance(self):
        aggregates = self.transactions.aggregate(sum=Sum('amount'))
        sum = aggregates['sum']
        return D('0') if sum is None else sum

这给了我10.00000的例子,这不是我想要的。我想10或者它有一半10.5等。

2 个答案:

答案 0 :(得分:1)

更改字段的小数位数

 models.DecimalField(max_digits=10, decimal_places=1,
                                  null=True, blank=True)

答案 1 :(得分:0)

Django的DecimalField将值填充为固定长度十进制数。例如,如果设置decimal_places = 1,则小数点后总是得到一位数,即使它为零。

我为自己修复此问题的方法是覆盖models.DecimalField中的行为,以创建我自己的字段VariableDecimalField,如下所示:

class VariableDecimalField(models.DecimalField):

  def get_db_prep_save(self, value, connection):
    s = str(value)
    return self.to_python(s.rstrip('0').rstrip('.') if '.' in s else s)

这将剥离任何无关紧要的尾随零,并且如果没有小数金额也将取消小数点..在它存储在数据库中之前。但是如果你想要保留尾随零,如果用户以这种方式输入,就这样做。

class VariableDecimalField(models.DecimalField):

  def get_db_prep_save(self, value, connection):
    return self.to_python(value)

然后只使用VariableDecimalField而不是DecimalField。