Python django:如何过滤没有空格的模型字段值?

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

我以前问过这个问题。可能是因为缺少想要的答案,再一次,我借此机会在这里以一种很好的方式解释我的问题

请注意:我正在使用MySQL数据库

我有一个叫做城市的模型。它包含id、名称

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