仅在 Django 查询中进行全字匹配

     2023-02-23     98

关键词:

【中文标题】仅在 Django 查询中进行全字匹配【英文标题】:Whole-word match only in Django query 【发布时间】:2013-02-06 11:57:21 【问题描述】:

我正在尝试编写一个仅匹配整个单词的 Django 查询。根据here 的回答,我尝试过类似的方法:

result = Model.objects.filter(text__iregex='\bsomeWord\b')

但这并没有返回预期的结果。我也试过了

result = Model.objects.filter(text__iregex=r'\bsomeWord\b')

无济于事。我的最终目标是也能够传入一个字符串变量,例如:

result = Model.objects.filter(text__iregex=r'\b'+stringVariable+r'\b')

result = Model.objects.filter(text__iregex=r'\b %s \b'%stringVariable)

但现在我什至无法让它与原始字符串一起使用。我正在使用 PostgreSQL。

【问题讨论】:

【参考方案1】:

当你使用 PostgreSQL 时,使用“\y”而不是“\b”,这是因为 Django 将你的正则表达式直接传递给 PostgreSQL——所以你的RegEx 需要与之兼容。您应该可以从psql 执行它们而不会出现任何问题。

result = Model.objects.filter(text__iregex=r"\y0\y".format(stringVariable))

见https://www.postgresql.org/docs/9.1/functions-matching.html#POSIX-CONSTRAINT-ESCAPES-TABLE

【讨论】:

Django 不会将 PCRE 转换为 PostgreSQL 正则表达式(请参阅:bit.ly/ZtpbgH)。所以你只需要使用 PostgreSQL 的原生正则表达式,看这里:bit.ly/ZtpojU 这行得通。感谢您添加关于\y 的解释。至于'0'.format(stringVariable) 部分,这只是'%s'%stringVariable 的另一种写法吗?两者似乎都对我有用。 是的,实际上他们都做同样的事情。我只使用 .format() 方式,因为 Python 3 需要它 (python.org/dev/peps/pep-3101)。【参考方案2】:

你也许可以通过删除正则表达式并使用一些 django 查找来获得一些东西

result = Model.objects.filter(Q(text__contains=' someword ') |
                              Q(text__contains=' someword.') |
                              Q(text__istartswith = 'someword.' |
                              Q(text__istartswith = 'someword.' |
                              Q(text__iendswith = 'someword')

有关文档,请参阅 here。

我意识到这不是那么优雅(但如果您不是正则表达式的粉丝,那么维护起来很容易)。

【讨论】:

因为这不会执行全字匹配;例如,如果我执行text__contains='tart',我会选择start 这样的结果。 我的错 - 我显然对 sql 不够熟悉,无法知道“全词匹配”意味着特定的东西。无论如何,我已经更新了我的答案以改进它。 易于维护?有很多情况你没有涵盖(在()、逗号等之间)。 如果您不喜欢正则表达式,则易于维护。你不需要知道 django 或 python 来阅读这个 - 但我必须引用任何解决这个问题的正则表达式。是的,这并不能涵盖所有内容 - 只有当您确信文本仅包含该语言的一个子集时,它才会起作用。【参考方案3】:

我在尝试使用与 Perl 兼容的转义序列 \b 匹配单词边界时遇到了同样的问题。我的后端数据库是 MySQL。

我通过字符类表达式[[:space:]]解决了这个问题,例如

        q_sum = Q()
        search_list = self.form.cleaned_data['search_all'].split(' ');
        for search_item in search_list:
            search_regex = r"[[:space:]]%s[[:space:]]" % search_item
            q_sum |= Q(message__iregex=search_regex)
        queryset = BlogMessages.objects.filter(q_sum).distinct()

【讨论】:

这不包括标点符号。

Django模板仅在for循环中第一次出现匹配时执行

】Django模板仅在for循环中第一次出现匹配时执行【英文标题】:Djangotemplateexecuteononlyfirstoccuranceofmatchinaforloop【发布时间】:2018-09-0808:42:53【问题描述】:我有一个带有指向文档的外键的视频表(多个视频指向一个文档)。我想... 查看详情

Django 通过匹配布尔值进行条件查询

】Django通过匹配布尔值进行条件查询【英文标题】:Djangoconditionalquerybymatchingbooleanvalues【发布时间】:2017-01-2809:23:50【问题描述】:我知道有几种方法可以实现,即if/else查询集、条件查询集、Q、聚合等。我基于这些提出了一些... 查看详情

“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL

】“ContentType匹配查询不存在”-仅在SQLite上,而不是MySQL【英文标题】:"ContentTypematchingQuerydoesnotexist"-onlyonSQLite,notMySQL【发布时间】:2015-05-2510:23:47【问题描述】:我在Django测试框架的运行方式上遇到了一个奇怪的错误。... 查看详情

MySQL 查找子字符串匹配并按匹配全字分组

】MySQL查找子字符串匹配并按匹配全字分组【英文标题】:MySQLFindingSubstringMatchesandGroupbyMatchFullWord【发布时间】:2018-08-0619:59:38【问题描述】:使用MySQL时,我找不到该表达式的正确术语组合。在我的语句中使用PHP用户输入变量... 查看详情

django全文检索(代码片段)

...索引擎模块whoosh和中文分词jiebapipinstallhaystackwhooshjieba1.2Django项目中添加haystack应用haystack作为一个全文检索管理模块应用,通过Django项目的配置文件中INSTALLED_APPS选项添加到项目中INSTALLEDS_APPS=[..‘haystack‘,#这个模块添加到所有子... 查看详情

Django - 匹配的查询不存在

】Django-匹配的查询不存在【英文标题】:Django-matchingquerydoesnotexist【发布时间】:2015-01-2820:29:43【问题描述】:我正在处理一个Django项目,我收到了这个错误,“状态匹配查询不存在。”为什么会这样?状态在模型商店中,你能... 查看详情

Django - 查询精确字符串匹配

】Django-查询精确字符串匹配【英文标题】:Django-QueryEXACTstringmatch【发布时间】:2016-03-0700:06:07【问题描述】:我的数据库中有一个具有此值的用户:booking_id->25DgW此字段在我的模型中标记为uniquebooking_id=models.CharField(null=False,un... 查看详情

Django REST EmailAddress 匹配查询不存在

】DjangoRESTEmailAddress匹配查询不存在【英文标题】:DjangoRESTEmailAddressmatchingquerydoesnotexist【发布时间】:2020-01-2610:49:36【问题描述】:我正在使用djangorest-auth和allauth对用户进行身份验证。成功注册并验证电子邮件后,我实现了一... 查看详情

在 Django Admin 中保存新对象并发送到 Celery 任务后,匹配查询不存在

】在DjangoAdmin中保存新对象并发送到Celery任务后,匹配查询不存在【英文标题】:Matchingquerydoesn\'texistafteranewobjectsaveinDjangoAdminandsenttoCelerytask【发布时间】:2015-09-0703:47:28【问题描述】:我在DjangoAdmin(Django1.8)中保存一个对象并将... 查看详情

匹配查询不存在 django V3.2.9

】匹配查询不存在djangoV3.2.9【英文标题】:matchingquerydoesnotexistdjangoV3.2.9【发布时间】:2022-01-0514:43:09【问题描述】:我正在尝试从POST请求中检索ID,当我确定该客户的特定ID存在时,该请求会引发匹配查询不存在,因为它的所有... 查看详情

Django 2.1 令牌匹配查询不存在

】Django2.1令牌匹配查询不存在【英文标题】:Django2.1Tokenmatchingquerydoesnotexist【发布时间】:2019-08-2814:28:37【问题描述】:我一直在尝试使用rest_framework.authtoken在Django中实现用户身份验证,就像在thisguide中一样。我的测试用例测试... 查看详情

在 Django 模型中进行迁移时出现“外键不匹配”错误

】在Django模型中进行迁移时出现“外键不匹配”错误【英文标题】:Getting\'foreignkeymismatch\'errorwhenmakingmigrationsinDjangomodel【发布时间】:2020-11-1309:01:16【问题描述】:我有一个这样的模型游戏(我正在定义PK字段,因为我通过带有... 查看详情

Django1.9:没有模型匹配给定的查询

】Django1.9:没有模型匹配给定的查询【英文标题】:Django1.9:Nomodelmatchesthegivenquery【发布时间】:2016-12-0520:50:25【问题描述】:我正在按照教程创建博客。根据教程,代码是正确的。唯一的区别是我使用Django1.9而不是1.8在视图中... 查看详情

如果查询匹配,则使用 Django 在 Ajax 调用后重定向

】如果查询匹配,则使用Django在Ajax调用后重定向【英文标题】:RedirectAfterAjaxcallusingDjangoifquery\'smatch【发布时间】:2019-07-1307:47:05【问题描述】:我知道此代码无法正常工作,因为请求不充分,但我不确定如何纠正它。我正在尝... 查看详情

我想在 Django 中进行两个查询集搜索

】我想在Django中进行两个查询集搜索【英文标题】:IwanttomaketwoquerysetsearchinDjango【发布时间】:2019-03-0300:54:47【问题描述】:使用django.Filter()搜索或过滤已保存在django中的帖子的详细信息。使用django的Q在查询集中进行搜索。使... 查看详情

使用 Django reduce(or_) - 如何将结果为 0 的不匹配查询存储在变量中

】使用Djangoreduce(or_)-如何将结果为0的不匹配查询存储在变量中【英文标题】:UsingDjangoreduce(or_)-HowcanIstoreanunmatchedquerywith0resultsinavariable【发布时间】:2019-01-1222:25:24【问题描述】:我有一个函数,它从数据列表中获取用户的输入... 查看详情

SQL - 仅在条件匹配时选择 [关闭]

】SQL-仅在条件匹配时选择[关闭]【英文标题】:SQL-Selectonlywhentheconditionmatches[closed]【发布时间】:2013-04-0816:29:53【问题描述】:我有一张如下表。IDNAME1JOHN2JANE3JACK在简单的select语句中,如何从表中查询JOHN和JANE?条件是:我。结... 查看详情

Django 计算匹配分数(联合后注释查询的解决方法)

】Django计算匹配分数(联合后注释查询的解决方法)【英文标题】:Djangocomputescoreofmatches(workaroundtoannotateaqueryafteraunion)【发布时间】:2020-12-1209:24:33【问题描述】:我需要计算拳击比赛期间运动员的排名。在我的模型中,我会跟... 查看详情