关键词:
【中文标题】仅在 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【问题描述】:我需要计算拳击比赛期间运动员的排名。在我的模型中,我会跟... 查看详情