You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:34:10