django 排序不适用于字符串数值

jdzmm42g  于 2023-03-13  发布在  Go
关注(0)|答案(4)|浏览(156)

我在DB中有一个文本字段(Django),用于输入金额

amount = models.TextField(null=True, blank=True)

SQL查询

select id, amount from payment order by amount asc;

  id   | amount  |
-------+---------+
 12359 | 1111111 |  ----> entered as "1111111" i.e a string value             
 12360 | 122222  |               
 12342 | 20      |               
 12361 | 222222  |               
 12364 | 2222222 |               
 12362 | 2222222 |               
 12290 | 260.00  |               
 12291 | 260.00  |               
 12292 | 260.00  |               
 12336 | 32      |               
 12363 | 3333333 |               
 12337 | 355     |                
 12331 | 45      |               
 12341 | 740     |             
 12343 | 741     |

问题-订购未按预期工作。
是否为预期行为?

vom3gejh

vom3gejh1#

当你使用字符串时,排序是基于ASCII的系统。为了缓解这类问题,最好使用models.DecimalField
更多信息请点击此处:https://docs.djangoproject.com/en/4.1/ref/models/fields/#decimalfield

ttvkxqim

ttvkxqim2#

金额字段应为数值字段而不是***文本字段***。然后排序将生效。

from decimal import Decimal

class Payment(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

然后请运行迁移

sqougxex

sqougxex3#

尝试以下方法之一:

select * from tab_name order by column_name::integer;
select * from tab_name order by cast(column_name AS integer);
select * from tab_name order by int8 (column_name);

我希望能帮助你。但是我不明白你为什么要在文本或varchar中保存你的整数。以后这会给你带来很多问题,空间和速度。

t0ybt7op

t0ybt7op4#

您可以将值Cast为浮点字段并按其排序:

MyModel.objects.annotate(as_float=Cast('amount', FloatField())).order_by('as_float')

但是,正如@IqbalHussain在回答中提到的那样,最好改变模式。

相关问题