我有一张我无法控制的桌子,但需要从中进行选择。字段“building”是一个varchar,并且在我的(非托管)django模型中也是这样定义的。但是当从该表中选择时,它应该被视为整数(有“000100”之类的值,最后是偶数空格)。
我需要一个像这样的简单过滤器:
.annotate(CastInt("building")).filter(building__castint__exact=my_id)
唯一的问题是,CastInt不存在。怎么能实现这个目标?我正在查看.extra()(我们不应再使用,因为它已被弃用)和RawSQL,但希望只使用Django ORM的解决方案,而不使用自定义编写的SQL?
编辑:目前使用来自here的黑客(在评论中):
Address.objects.extra(where=('CAST(TRIM(building) AS UNSIGNED)=%s',),
params=(building_no, ))
有效,但很难看。
编辑II:看到我接受的答案 - 使用我的第二好朋友,正则表达式。
答案 0 :(得分:1)
尽可能简单:使用正则表达式查询
regex = r'^0{0,4}%s ?$' % building_no
address = Address.objects.filter(building__iregex=regex)\
关于表现欢迎的任何提示......
答案 1 :(得分:-3)
尝试简单int(you string value)
例如:
str = "00100"
int(str)
将100作为整数值。 同样适用于
str = "100100"
int(str)
将100100作为整数