【问题标题】:Django: Cast CharField to Integer if possibleDjango:如果可能,将 CharField 转换为整数
【发布时间】:2020-03-25 08:42:22
【问题描述】:

我有以下代码将字段my_field 转换为整数进行排序。

self.object_list = self.object_list.annotate(order_field=Cast('my_field', IntegerField())) \
                                   .order_by('order_field')

问题是某些数据字段可能不是数字的,因此会引发错误。有没有办法只在可能的情况下Cast

我正在寻找两个案例-

  1. 返回完整的object_list,将那些可能的排序并将其他保留在前端/后端。
  2. 仅返回 object_list,其中 my_field 可以转换为整数

【问题讨论】:

    标签: django python-3.x exception django-models


    【解决方案1】:

    有没有办法只在可能的情况下进行投射

    你可以试试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 标志之类的内容进行注释,然后按 @ 排序987654326@和is_numeric

    【讨论】:

    • 使用 postgres,得到以下错误 function isnumeric(character varying) does not exist。仍然感谢您给我正确的想法,进行正则表达式匹配。
    • 是的,抱歉,这适用于 MySQL。是的,我看到 PostgreSQL 的数字检查主要是使用正则表达式完成的,所以祝你好运! :)
    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2022-01-18
    • 2020-11-24
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多