2011-10-25 45 views
1

我创建基本上存储的鞋码,以及其他信息的应用程序。我一直在使用Django Decimal字段来存储大小,但是十进制字段像10一样存储大小为10.0,所以我的问题是,有没有办法使或如果已经存在一个字段,当提供一个int(10)它将该值存储为int,并在提供小数点后 (10.5),然后将其存储为小数?Django的智能小数场

+0

它实际上并不会将它存储为DecimalField中的int类型。你可能想看写一个模板标签或模型方法输出一个打印的十进制数字为整数 –

+0

我需要的价值被存储为收到,所以我可以从数据库中导入它,而不必担心大约.0 – Paulo

+1

也许只使用一个CharField有严格的清洁方法 –

回答

3

TBH的鞋码现场我可能会使用一个CharField有选择属性 - 有有效的鞋码的数量相对较少,并且这样你可以格式化你想怎样。

如果它可能包含鞋子以外的东西产品模型的一部分,一个CharField为“尺寸”是有用的,因为你还可以存储像“M”,“L”,“XXL”等

您不需要对鞋号进行任何数学运算,因此使用DecimalField毫无意义。

出于这个原因,它并不重要,什么是保存在数据库中,只有你显示和@j_syk有一对夫妇的沿着评论这些线路很好的选择建议。

+0

以'M','L'等为佳。甚至有些鞋子的尺寸也是这样,就像一些拖鞋和凉鞋一样。猜猜这取决于存储的数据是关于鞋子还是关于一个人的鞋子尺寸(即,我永远不会说我的鞋子尺寸是XL)。 –

+0

我选择了使用charfield进行选择,现在我想它是最简单的方法:) – Paulo

2

不只是强制转换为你一个字符串的工作?您可以保留原有存储空间,但在展示数据时根据自己的喜好设置数字格式。

>>> str(Decimal(10)) 
'10' 
>>> str(Decimal(10.5)) 
'10.5' 
>>> str(Decimal(10.0)) 
'10' 
+0

我从来没有想过这个,你认为这是最好的方法,这意味着我必须编写一个自定义字段,以添加此功能? – Paulo

+0

也许你可以使用'CharField'与[初始值](https://docs.djangoproject.com/en/dev/ref/forms/fields/#initial)如你所愿(只是将它转换为呈现它一个字符串)。保存时,'Decimal'类将为你保存,所以不用担心:这将工作得很好。 – jro

+0

但是,当小数类保存它,它会保存与.o? – Paulo

1

我采用了这种解决方案:

  1. 创建自定义Django model Field
  2. 它会返回一个自定义decimal.Decimal实例实现把戏__unicode__因为这只是一种表象的事情

这里摘录:

class PyPrettyDecimal(decimal.Decimal): 

    def __unicode__(self): 
     # TODO: to improve with decimal properties ?!? 
     mod = self - int(self) 
     if not mod: 
      rv = int(self) 
     else: 
      rv = self.quantize(mod.normalize()) 
     return unicode(rv) 

class PrettyDecimalField(models.DecimalField): 

    __metaclass__ = models.SubfieldBase 

    def to_python(self, value): 
     if value is None: 
      return value 
     try: 
      return PyPrettyDecimal(value) 
     except decimal.InvalidOperation: 
      raise exceptions.ValidationError(self.error_messages['invalid'])