数字顺序忽略Django Postgres中的小数

时间:2016-02-06 21:12:55

标签: python django postgresql sqlite

在SQLite中本地构建。我的应用程序有对象价格的数字。在SQLite中我能够定期定价(例如:$ 914,$ 799,$ 120,$ 95,9.00,7.50。)

将应用程序推送到Postgres之后,数字就会出现: 95,914,9.00,799,7.50,120。

我显然希望在Postgres中按价格从高到低,从低到高来订购。我究竟做错了什么?

模型字段:

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

URL:

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,
})

2 个答案:

答案 0 :(得分:1)

首先,decimalField基于python decimal

根据this answer关于十进制值的问题,postgres存储小数的方式是打包的BCD字符串。您的订单显示方式反映了排序字符串的顺序,而不是数字。

不太确定django如何实现DecimalField的排序,但我假设它正在将它排序为字符串。

虽然DecimalField似乎适合您的用例,但您可能希望切换到FloatField以获得您正在寻找的排序。

答案 1 :(得分: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