Django ORM - 喜欢的百分号

Posted

技术标签:

【中文标题】Django ORM - 喜欢的百分号【英文标题】:Django ORM - percent sign for like 【发布时间】:2012-06-03 18:24:36 【问题描述】:

在我的网站上,用户应该能够过滤数字,例如 *123*321*,将匹配“666 123 555 321 111”或 LIKE '%123%321%'

默认情况下,django 的 orm 转义 %-sign。我可以使用正则表达式或原始查询,但有一些解决方法吗?

UPD:我会把它放在这里以另一种方式显示。

integer_search = [] # for colorizing found substrings
if actual['integer']:
    integer_match = filter(None, actual['international'].split('*'))
    integer_search = integer_match
    integer_match = ''.join('%s[[:digit:]]*' % i for i in integer_match)
    integers = integers.filter(international__regex=integer_match)

【问题讨论】:

【参考方案1】:

是的,Django 替换了所有的 %_。来自docs:

这意味着事情应该直观地工作,所以抽象不会 泄漏。例如,要检索包含百分比的所有条目 符号,只需将百分号用作任何其他字符

我建议你使用extra 方法。它不是真正的原始 sql,虽然看起来很老套:

YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%'])

【讨论】:

如果你使用这个想法,那么请检查你没有创建 SQL 注入攻击。 @NickCraig-Wood 是的,params 阻止它。 我只想指出,我认为,如果某些工具禁用了原始功能,它应该是一种使用类似于该功能的想法的方法来启用它的方法。我的意思是,__icontains='' 方法已经接受了一个参数,那么为什么不只是在一个地方禁用转义,比如.filter(field__icontains='%1', field__pescape=False)?当我使用 extra() 时,我会走得更远。我只是想了解:django 的开发人员跳过了这个,因为它超出了 django 的理念,或者这种能力不在首要需求列表中?无论如何,谢谢,我会标记你的答案。 我不喜欢你的建议,但你可以offer社区

以上是关于Django ORM - 喜欢的百分号的主要内容,如果未能解决你的问题,请参考以下文章

评分算法:如何将“喜欢”和“不喜欢”的数量和百分比转换为一个分数?

Django获取百分比过滤对象

JavaScript 分号使用总结

Js中分号使用总结

Django模型南0.7.6迁移问题:表中的任何更改与另一个字段的默认值百分比

html中的大括号和百分号是啥意思?