Django SQL OR via filter() & Q(): 动态?

Posted

技术标签:

【中文标题】Django SQL OR via filter() & Q(): 动态?【英文标题】:Django SQL OR via filter() & Q(): Dynamic? 【发布时间】:2011-05-08 00:54:21 【问题描述】:

我正在我的 Django 网站上实现一个简单的 LIKE 搜索,我目前使用的是以下代码:

from django.db.models import Q
posts = Post.objects.filter(Q(title__icontains=query)|Q(content__icontains=query))

query 是一个字符串。这会产生一个LIKE SQL 语句并且工作得很好。现在我还想将我的搜索查询拆分为词或词:

words = query.split(' ')

所以words现在包含一个单词列表,我想实现一个类似的SQL语句:

SELECT ... FROM foo WHERE `title` ILIKE '%word1%' OR `title` ILIKE '%word2%'
  OR `content` ILIKE '%word1%' OR `content` ILIKE '%word2%'

如果有两个以上的单词,我希望语句按每个单词列出所有条目。

有什么想法吗?谢谢!

【问题讨论】:

不要忘记清理您的查询,否则您将处于与 Boby Table 学校相同的情况。 在 djapian 中使用全文搜索怎么样? @the_drow:Django(或者更准确地说,DB-API)已经解决了这个问题。 @the_drow 谢谢 :) 会记住这一点 【参考方案1】:
reduce(operator.or_, sequence_of_Q_objects)

【讨论】:

啊,抱歉,这里有错字。已移除。这个好像可以,太感谢了,不知道这个reduce()函数和operator.or_ reduce(lambda: q, w: q | Q(...=w), query.split(' '), Q()),不过对于一个班轮来说可能太复杂了。

以上是关于Django SQL OR via filter() & Q(): 动态?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用“.filter().filter().filter()...”有缺点吗?

Django filter中contains 用法

django使用原生SQL的方法

Django-filter:按模型属性过滤

在django中,执行原始sql语句

使用 Extra 和 Filter 的 Django OR 查询