2011-10-25 52 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'])