2011-09-06 99 views
5

我通過Django將數據保存到PostgreSQL後端。我的模型中的許多字段都將DecimalFields設置爲任意高的max_digits和decimal_places,對應於數據庫後端中的數字列。每列中的數據具有未知的精確度(或小數位數)先驗,並且給定列中的每個數據不需要具有相同的精度。用Django DecimalField和PostgreSql數字字段保留輸出精度

例如,參數模型可能看起來像:

{'dist': Decimal("94.3"), 'dist_e': Decimal("1.2")} 
{'dist': Decimal("117"), 'dist_e': Decimal("4")} 

,其中鍵是數據庫列名。

輸出時,我需要保存並重新顯示讀取數據的精度。換句話說,在查詢數據庫之後,顯示的數據需要看起來與讀入的數據完全相同,小數點後面沒有附加或缺失的0。但是,在查詢時,無論是在django shell還是在管理界面中,所有DecimalField數據都會返回多個尾隨0。

我已經看到類似的問題回答貨幣價值,其中精確度(2位小數)是既知道和給定列中的所有數據相同。但是,如果精度不一致且事先不知道,那麼如何最好地保留由Django中的Decimal值和PostgreSQL中的數值表示的精確精度?

編輯:

可能的信息的附加有用的片:在查看該數據被保存dbshel​​l在Django表中,許多拖尾的0也存在。在保存到PostgreSQL後端時,python Decimal值顯然轉換爲models.py文件中指定的最大精度值。

+0

如果Django混淆了你的數字,你可能需要編寫一個自定義的ModelField,無論是從DecimalField子類還是從頭開始: -/ – Dave

+0

是的。不幸的是,這個問題的簡短答案似乎是,Django不支持未精確指定的PostgreSQL數字列。我爲此考慮了一些解決方法,只要我有時間來制定它,我就會問另一個問題,以徵求他們的意見/建議。 – krosbonz

回答

1

如果您需要完美的奇偶校驗向前和向後,您需要使用CharField。任何基於數字的數據庫字段都將與您的數據以某種方式混合進行交互。現在,我知道你提到不能知道數據點的數字長度,而CharField需要一定的長度。您可以將其設置爲任意高(1000,2000等),或者我想您可以使用TextField。

但是,無論採用哪種方法,在大多數情況下都會浪費大量數據庫資源。我會建議修改你的方法,使最後的零不重要(爲了顯示的目的,你總是可以將它們關閉),或者使得精度不再是任意的。

1

由於前一段時間我問過這個問題,答案保持不變,我會分享我發現的內容,如果它對任何處於類似位置的人都有幫助。 Django無法以任意精度利用PostgreSQL Numerical列類型。爲了保持我上傳到我的數據庫的數據的顯示精度,爲了能夠對從數據庫查詢獲得的值執行數學計算,而無需首先將字符串重新轉換爲python Decimal類型,我選擇爲每個數據庫添加一個額外的精度列數據庫中的數字列。

精度值是一個整數,指示小數點後需要多少個數字。基準4.350在其相應的精度列中被賦值爲3。通常顯示的整數(例如2531)的精度爲0。然而,以科學記數法報告的大整數被賦予一個負整數以保持其顯示精度。例如,值4.320E+33可以獲取精度條目-3。數據庫識別出所有具有負精度值的對象應以科學記數法重新顯示。

該解決方案爲圍繞數據庫的結構和代碼增加了一些複雜性,但它已被證明是有效的。它還允許我通過計算精確地保持精度,例如轉換爲日誌和線性值。