use*_*250 4 python regex django
我之前问过这个问题.可能是由于缺乏理想的答案,我再次以此为契机,在这个空间以一种美好的方式解释我的问题.
请注意:我使用的是MySQL数据库
我有一个名为City的模型.它包含id,name.
id name
1 New York
2 New India
3 New USA
4 New UK
Run Code Online (Sandbox Code Playgroud)
现在使用以下语法
请注意:作为示例,我在下面的语法中输入静态值,即New.最后它应该是动态价值.
City.objects.filter(name__icontains = "新")
显然我得到了纽约,新印度,新美国,新英国
从这一点来说,我很好.
现在转移到我的问题.我想只过滤纽约市的名字.用户可以通过其他方式键入newyork(或)New York(或)NEWYORK(或)NEY yOrk(或),但最后我必须从模型字段值中删除空格并获得所需的结果.
City.objects.filter(name__iregex= "newyork") ?// How to fix this one
CURRENT OUTPUT is:
[]
DESIRED OUTPUT is:
New York
Run Code Online (Sandbox Code Playgroud)
您可以使用自定义查找功能.
from django.db.models import Transform
class SpaceRemovedValue(Transform):
lookup_name = 'nospaces'
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
return "REPLACE(%s, ' ', '')" % lhs, params
from django.db.models import CharField
CharField.register_lookup(SpaceRemovedValue)
Run Code Online (Sandbox Code Playgroud)
现在你可以使用它:
City.objects.filter(name__nospaces= "newyork")
Run Code Online (Sandbox Code Playgroud)
请注意,这是非常低效的.它需要MySQL扫描并处理City表中的每一行; 如果你有多个,那将需要一段时间.
另一种方法是将名称字段的空格删除版本保存到单独的字段中,然后可以直接查询.您可以覆盖该save方法以在保存之前自动填充该字段.