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 - 喜欢的百分号的主要内容,如果未能解决你的问题,请参考以下文章
评分算法:如何将“喜欢”和“不喜欢”的数量和百分比转换为一个分数?