Django中如何实现部分精确匹配查询,筛选指定目标记录?
解决Django查询匹配错误的问题
我来帮你搞定这个问题!你当前用__icontains导致两条记录都被返回,是因为记录#1的name值aaaa-bbbb (cd)里,其实包含了aaa-bbbb这个子串(从第二个字符开始的aaa-bbbb),所以icontains会把它也捞出来。要精准匹配到记录#2,有这几个靠谱的方法:
方法1:使用startswith前缀匹配
这是最直接的方式,因为你要找的记录#2的name是以你搜索的关键词开头的,而记录#1的开头是aaaa-,完全不匹配。
当搜索关键词是'aaa-bbbb'时:
from django.db.models import Q ret = models.Hello.objects.filter(Q(name__startswith='aaa-bbbb'))
当搜索关键词是'aaa-bbbb (c'时:
ret = models.Hello.objects.filter(Q(name__startswith='aaa-bbbb (c'))
如果需要同时支持两个关键词的搜索,直接用Q对象组合即可:
ret = models.Hello.objects.filter( Q(name__startswith='aaa-bbbb') | Q(name__startswith='aaa-bbbb (c') )
方法2:使用正则表达式精确匹配
如果你需要更灵活的匹配规则(比如后续可能有更复杂的搜索需求),可以用Django的__regex(区分大小写)或__iregex(不区分大小写)来精准定位:
比如匹配以aaa-bbbb开头的记录(避免中间子串匹配):
ret = models.Hello.objects.filter(Q(name__iregex=r'^aaa-bbbb'))
这里的^符号表示字符串的起始位置,所以只会匹配开头就是aaa-bbbb的记录,完美避开记录#1。
如果要匹配包含aaa-bbbb (c的记录,注意正则里括号是特殊字符,需要转义:
ret = models.Hello.objects.filter(Q(name__iregex=r'aaa-bbbb \(c'))
同样,组合两个关键词的正则查询:
ret = models.Hello.objects.filter( Q(name__iregex=r'^aaa-bbbb') | Q(name__iregex=r'aaa-bbbb \(c') )
这两种方法都能精准帮你拿到记录#2,不会误捞记录#1~
内容的提问来源于stack exchange,提问作者user3792705
相关产品推荐
相关产品推荐

