过滤django中两个模型字段的串联

时间:2013-08-19 16:08:50

标签: django django-queryset

使用以下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方法覆盖来维护它,但我想知道是否我可以动态地执行此操作,而无需维护此类“搜索索引”类型的列。

1 个答案:

答案 0 :(得分:2)

最直接的方法是使用QOR

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连接或非规范化)相比,我无法说明此解决方案的性能,但它肯定更简单。