2016-02-06 57 views
0

在SQLite本地構建。我的應用程序有對象的價格數字。在SQLite中,我能夠定期對價格進行排序(例如:914美元,799美元,120美元,95美元,9.00美元,7.50美元)。數字順序忽略Django Postgres中的小數點

推送應用程序到Postgres後,數字如下: 95,914,9.00,799 ,7.50,120。

我顯然希望按照價格從高到低排列,並在Postgres從低到高。我究竟做錯了什麼?

模場:

price = models.DecimalField(max_digits=8, decimal_places=2, null=True) 

網址:

url(r'^browse/price_desc/$', 'collection.views.price_desc', name="pricehigh") 

查看:

def price_desc(request): 
     items = item.objects.all.order_by('-price') 

     return render(request, 'index.html', { 
      'items' : items, 
}) 
+1

如果他按他的建議訂購95,914,9.00,799,7.50,120的物品,那麼顯然訂購是錯誤的。 –

回答

1

首先,在decimalField是基於Python的decimal

根據this answer對Decimal值的問題,postgres存儲小數點的方式是打包的BCD字符串。您的訂單顯示的方式反映了排序字符串的順序,而不是數字。

不太確定django如何實現DecimalField的排序,但我假定它將它排序爲字符串。

儘管DecimalField看起來適合您的用例,但您可能希望切換到FloatField以獲得您正在查找的排序。

+0

在處理貨幣時,建議使用浮動來存儲感覺是一個糟糕的主意。 –

0

Postgres的商店和訂單NUMERIC值你所期望的:

CREATE TABLE numeric_test (id SERIAL, value NUMERIC(8,2)); 
INSERT INTO numeric_test (value) VALUES (914), (799), (120), (95), (9), ('7.5'); 
SELECT * FROM numeric_test; 
id │ value 
────┼──────── 
    1 │ 914.00 
    2 │ 799.00 
    3 │ 120.00 
    4 │ 95.00 
    5 │ 9.00 
    6 │ 7.50 
(6 rows) 

我懷疑那麼,你的數據庫沒有存儲爲NUMERIC。也許您的遷移實際上是將該列創建爲TEXT

+0

我認爲問題出在這些方面。當我第一次在模型中創建模型時,十進制字段是一個char字段。不知道這與它有什麼關係。我顯然是數據庫的新手,所以你建議我開始排除故障? –

+0

你能顯示你的遷移文件嗎?很可能它仍然是以'VARCHAR'或其他方式創建的。它可能會遷移和修復,但如果您仍處於早期階段,則可能會更簡單地刪除此應用的所有遷移並重新開始。 –

+0

我剛剛檢查了postgres數據庫,模型確實有CharField。你會建議刪除生產服務器上的遷移嗎? –