Django Queryset:过滤前在 SQL 中投射 VARCHAR 字段

Django Queryset: Cast VARCHAR field in SQL before filtering

我有一个我无法控制的 table,但需要从中 select。字段 "building" 是一个 varchar,在我的(非托管)django 模型中也是这样定义的。但它应该被视为整数,当 select 从 table 开始时(有像“000100”这样的值,最后还有空格)。

我需要一个像这样的简单过滤器:

.annotate(CastInt("building")).filter(building__castint__exact=my_id)

唯一的问题是,CastInt 不存在。如何做到这一点?我正在查看 .extra()(我们不应该再使用它,因为它已被弃用)和 RawSQL,但希望只使用 Django ORM 的解决方案,而无需自定义编写 SQL?

编辑:目前正在使用来自 here 的 hack(在评论中):

Address.objects.extra(where=('CAST(TRIM(building) AS UNSIGNED)=%s',),
                      params=(building_no, ))

有效,但很丑。

编辑 II:查看我接受的答案 - 使用我的第二好朋友正则表达式。

尝试简单的int(you string value)

例如:

str = "00100"
int(str)

将给出 100 作为整数值。 同样适用于

 str = "100100"
int(str)

给出 100100 作为整数

越简单越好:使用正则表达式查询

regex = r'^0{0,4}%s ?$' % building_no
address = Address.objects.filter(building__iregex=regex)\

欢迎任何有关性能的提示...