Django Queryset:在过滤之前在SQL中转换VARCHAR字段

时间:2015-08-18 09:45:34

标签: python django django-models django-orm

我有一张我无法控制的桌子,但需要从中进行选择。字段“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:看到我接受的答案 - 使用我的第二好朋友,正则表达式。

2 个答案:

答案 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作为整数