2013-03-24 72 views
0

在我的数据库中,我有一个域用于存储信用点。信用是在0.5的倍数,例如一个人可以有1,1.5 10或100等使用DecimalField以正确的精度显示

我已选择在数据库中,该右外场?....

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等

回答

1

变化领域的小数

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

这将允许0.5? – MarkO 2013-03-24 12:36:20

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。