1

當我使用DecimalField時,我在數據庫中的位置很少。不幸,我必須處理雙重和浮動數據作爲輸入 - 這是我的問題。Django自定義十進制字段 - 自動浮動到雙重轉換的最佳方式?

我想做殘酷的價值(小數點後第二位),而不是數學回合。我存儲的目標是幾乎超過計算值(如果我的價值49.0000032131它仍然不到50,所以我不會把它湊到一起)。但正如我所說 - 我想將它保存爲48.98在數據庫(2位小數) - 節省內存和足夠的表示。

我的第一個解決方案是使用自定義Django的領域,這樣的事情:

class DecimalFixedField(models.DecimalField): 

def __init__(self, *args, **kwargs): 
    kwargs['value'] = "{0:.2f}".format(kwargs['value'])    
    # or ? self.value = "{0:.2f}".format(kwargs['value']) 
    super(DecimalFixedField, self).__init__(*args, **kwargs) 

我當然應該硬編碼decimal_places = 2 kwargs或使用它的代碼並不值2,但是......對其餘什麼?你有提示,更好的主意嗎?

什麼是重要的 - 我不想在代碼中的許多地方寫「{0:.2f}」。格式(...)。我想在OOP方法中做到這一點,因爲我在許多模型中使用DecimalField ......並且使這種預處理看起來很不錯。任何想法如何正確實施?

回答

0

嘗試使用此:

from decimal import Decimal 

my_value = Decimal(value) 
+0

我知道這一點,但作爲我說 - 我有8個模型使用DecimalField,並且...我想要在一個地方以優雅的方式做到這一點。不在每個新模型或代碼中可以將浮點值保存到DecimalField中的每個地方:) – Izzy

+0

儘管此代碼可能回答此問題,但提供有關爲什麼和/或如何回答問題的其他上下文會顯着提高其長期價值。請[編輯]你的答案,添加一些解釋。 – CodeMouse92

0

思考和努力我做了這樣的事情之後:

class DecimalFixedField(models.DecimalField): 

    def pre_save(self, model_instance, add): 

     # reading value 
     value_field = getattr(model_instance, self.attname) 

     # casting to decimal if the value is not a decimal (float for example) 
     if not isinstance(value_field, decimal.Decimal): 
      value_field = decimal.Decimal(str(value_field)) 

     # there you can cut off the value 
     quantized_value = value_field.quantize(decimal.Decimal(str(0.1**self.decimal_places)), rounding=decimal.ROUND_DOWN) 

     # saving value 
     setattr(model_instance, self.attname, quantized_value) 
     return quantized_value 

mayby會有幫助的人:)

相關問題