在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,
})
答案 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
?