使用以下Django模型:
class Item(models.Model):
name = CharField(max_len=256)
description = TextField()
我需要制定一个过滤方法,该方法获取n个单词(word_list
)的列表,并返回Items的查询集,其中word_list
中的每个单词都可以在名称或描述中找到。
使用单个字段执行此操作非常简单。使用here描述的reduce技术(这也可以通过for
循环完成),如下所示:
q = reduce(operator.and_, (Q(description__contains=word) for word in word_list))
Item.objects.filter(q)
我想做同样的事情,但要考虑到每个单词都可以出现在名称或描述中。我基本上想要查询每个单词的两个字段的串联。可以这样做吗?
我已经读过Postgresql中有一个连接运算符,||
但是我不确定是否可以在django中以某种方式利用它来实现这一目的。
作为最后的手段,我可以创建第三列,其中包含两个字段的组合,并通过post_save
信号处理程序和/或save
方法覆盖来维护它,但我想知道是否我可以动态地执行此操作,而无需维护此类“搜索索引”类型的列。
答案 0 :(得分:2)
最直接的方法是使用Q
来OR
:
lookups = [Q(name__contains=word) | Q(description__contains=word)
for word in words]
Item.objects.filter(*lookups) # the same as and'ing them together
与其他两个选项(原始SQL连接或非规范化)相比,我无法说明此解决方案的性能,但它肯定更简单。