我有以下代码将字段 my_field
转换为整数以进行排序。
self.object_list = self.object_list.annotate(order_field=Cast('my_field', IntegerField())) \
.order_by('order_field')
问题是某些数据字段可能是非数字的,因此会引发错误。有没有办法仅在可能的情况下Cast
?
我正在寻找两个案例 -
- 返回完整的
object_list
,对可能的对象进行排序,并将其他对象保留在前端/末尾。 - 仅返回
object_list
,其中my_field
可以转换为整数
最佳答案
Is there a way to Cast only if possible
您可以尝试使用extra :
self.object_list.extra(
where=[
"ISNUMERIC(my_field) = 1"
]
).annotate(
order_field=Cast('my_field', IntegerField())
).order_by('order_field')
这将解决您的(2)要求并完成(1),您可以使用相同的查询将 where
更改为 select
(请参阅文档)来注释某些内容就像 is_numeric
标志,然后按 order_field
和 is_numeric
排序。
关于Django:如果可能的话,将 CharField 转换为 Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60845355/