gpt4 book ai didi

django - 具有字符和整数的查询集 order_by 字段

转载 作者:行者123 更新时间:2023-12-02 08:42:15 27 4
gpt4 key购买 nike

我有一个模型,它有一个存储为 string 的字段(我们称之为 this_field)。 this_field 中的值采用 Char### 的形式 - 例如,它们具有以下值:A4A34A55(请注意,它们的第一个字符始终相同)。

有没有办法选择所有记录并按此字段排序?目前,当我执行 .order_by('this_field') 时,我得到这样的订单:

A1A13A2A25等等……

我想要的是:

A1A2A13A25等等……

是否有任何最佳方法或解决方案来实现正确排序的查询集?

最佳答案

查询集排序由数据库后端处理,而不是由 Django 处理。这限制了更改订购方式的选项。您可以加载所有数据并使用 Python 对其进行排序,或者向您的查询添加其他选项,让数据库通过定义函数使用某种自定义排序。

使用查询集 extra()函数将允许您通过执行自定义 SQL 进行排序来做您想做的事,但代价是降低了可移植性。

在您的示例中,将输入字段拆分为两组数据(初始字符和剩余整数值)可能就足够了。然后您可以对两列进行排序。这是一个示例(未经测试):

qs = MyModel.objects.all()

# Add in a couple of extra SELECT columns, pulling apart this_field into
# this_field_a (the character portion) and this_field_b (the integer portion).

qs = qs.extra(select={
'this_field_a': "SUBSTR(this_field, 1)",
'this_field_b': "CAST(substr(this_field, 2) AS UNSIGNED)"})

extra 调用将两个新字段添加到 SELECT 调用中。第一个子句提取字段的第一个字符,第二个子句将字段的其余部分转换为整数。

现在应该可以对这些字段进行order_by。通过为 order_by 指定两个字段,顺序首先应用于字符字段,然后应用于整数字段。

例如

qs = qs.order_by('this_field_a', 'this_field_b')

这个例子应该适用于 MySql 和 SQLite。还应该可以创建一个仅用于排序的额外字段,允许您在 order_by() 调用中仅指定一个字段。

关于django - 具有字符和整数的查询集 order_by 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15467920/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com