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)\
欢迎任何有关性能的提示...
我有一个我无法控制的 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)\
欢迎任何有关性能的提示...