Python django:如何过滤没有空格的模型字段值?
我以前问过这个问题。可能是因为缺少想要的答案,再一次,我借此机会在这里以一种很好的方式解释我的问题 请注意:我正在使用MySQL数据库 我有一个叫做城市的模型。它包含id、名称Python django:如何过滤没有空格的模型字段值?,python,regex,django,Python,Regex,Django,我以前问过这个问题。可能是因为缺少想要的答案,再一次,我借此机会在这里以一种很好的方式解释我的问题 请注意:我正在使用MySQL数据库 我有一个叫做城市的模型。它包含id、名称 id name 1 New York 2 New India 3 New USA 4 New UK 现在使用下面的语法 请注意:作为示例,我将静态值,即New放在下面的语法中。最后,它应该是动态值 City.objects.filter(name\uu icon
id name
1 New York
2 New India
3 New USA
4 New UK
现在使用下面的语法
请注意:作为示例,我将静态值,即New放在下面的语法中。最后,它应该是动态值
City.objects.filter(name\uu icontains=“New”)
显然,我得到了纽约、新印度、新美国、新英国
从这一点上说,我很好
现在转到我的问题。我只想筛选纽约的城市名称。用户可以键入newyork(或)newyork(或)newyork(或)newyork(或)newyork(或)newyork(或)newyork(或)其他方式,但最后我必须从模型字段值中去掉空格并获得所需的结果
City.objects.filter(name__iregex= "newyork") ?// How to fix this one
CURRENT OUTPUT is:
[]
DESIRED OUTPUT is:
New York
你可以用a来做这个
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)
现在您可以使用它:
City.objects.filter(name__nospaces= "newyork")
注意这是非常低效的。需要MySQL扫描处理City表中的每一行;如果你有超过几个,这将需要一段时间
另一种方法是将名称字段的删除空格版本保存到单独的字段中,然后您可以直接查询该字段。您可以覆盖
save
方法,以便在保存字段之前自动填充该字段。一种可能性是在每个搜索字符串字符之间添加可选的空白字符\s*
:
def insert_whitespace(string):
s = []
for i in range(0, len(string)):
s.append(string[i:i+1])
return '\\s*'.join(s)
然后
我相信这不是最好的解决方案,但可能会有所帮助
# Query you entire table
from myapp.models import City
cities = City.objects.all().values('name', 'id') # If it get extra values later
user_entry = 'newyork'
def is_match(cities, user_entry):
result_list = []
for city in cities:
for value in city['name'].lower().split(' '):
if value in user_entry.lower():
l.append(city['id'])
break
return result_list
# Then call
is_match(cities=cities, user_entry=user_entry)
# Should return something like this
[1L] # A list with id of possibles matchs
函数是_match
可以是一个列表理解,但我认为这样更清晰
对于较大的数据,这将更加低效,但可能会给您一个开始的想法。您使用的是什么数据库?MySQL是我正在使用的数据库city.objects.filter(Q(name_uicontains='New York')|Q(name_uicontains='NewYork'))
# Query you entire table
from myapp.models import City
cities = City.objects.all().values('name', 'id') # If it get extra values later
user_entry = 'newyork'
def is_match(cities, user_entry):
result_list = []
for city in cities:
for value in city['name'].lower().split(' '):
if value in user_entry.lower():
l.append(city['id'])
break
return result_list
# Then call
is_match(cities=cities, user_entry=user_entry)
# Should return something like this
[1L] # A list with id of possibles matchs