2

使用以下 Django 模型:

class Item(models.Model):
  name = CharField(max_len=256)
  description = TextField()

我需要制定一个过滤器方法,该方法采用 n 个单词 ( word_list) 的列表并返回 Items 的查询集,其中每个单词word_list都可以在名称或描述中找到。

使用单个字段执行此操作非常简单。使用这里描述的 reduce 技术(这也可以通过for循环来完成),这看起来像:

q = reduce(operator.and_, (Q(description__contains=word) for word in word_list))
Item.objects.filter(q)

我想做同样的事情,但要考虑到每个单词都可以出现在名称或描述中。我基本上想为每个单词查询两个字段的连接。这可以做到吗?

我读过 Postgresql 中有一个连接运算符,||但我不确定是否可以在 django 中以某种方式使用它来实现这一目的。

作为最后的手段,我可​​以创建包含两个字段组合的第三列,并通过post_save信号处理程序和/或save方法覆盖对其进行维护,但我想知道是否可以在不维护这种类型的情况下即时执行此操作“搜索索引”类型的列。

4

1 回答 1

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

于 2013-08-19T19:16:22.753 回答