django:如何用空格过滤模型字段值?

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)

Dan*_*man 6

您可以使用自定义查找功能.

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方法以在保存之前自动填充该字段.