【问题标题】:Search multiple fields of django model without 3rd party app在没有第三方应用程序的情况下搜索 django 模型的多个字段
【发布时间】:2011-05-28 02:06:23
【问题描述】:

我的 django 应用中有一个模型,我想为其创建搜索表单。有没有办法使用相同的搜索字符串一次搜索模型中的所有字段?我已经研究过 xapian 和 solr ,但搜索超过 1 个模型似乎需要很多开销。我希望能够这样说:

results = Assignment.objects.filter(any_column = search_string)

我意识到可能没有什么简洁的方法,但现在除了使用搜索应用程序之外,我能想到的唯一选择是分别检查每个字段并将结果连接在一起。

【问题讨论】:

  • reduce()operator.or_Q 对象和 kwarg 扩展。
  • 你能举一个简单的例子吗?可能有 2 个字段?我尝试在 django 文档中查找 reduce() 函数,但找不到。

标签: django search django-models


【解决方案1】:

拥有所有field names 后,您可以使用kwarg expansion 创建Q objects,并使用reduce()operator.or_ 将它们变成一个查询。

qgroup = reduce(operator.or_, (Q(**{fieldname: value}) for fieldname in fieldnames))
asgns = Assignment.objects.filter(qgroup)

【讨论】:

  • 我不得不在 Q(...) 对象周围添加括号,否则这就像一个魅力!谢谢你。有没有理由为什么这样的东西没有成为 django 中的快捷方式。你会认为搜索像我最初示例这样的语法这样的简单模型会是一个很好的工具,对吧?
  • 不知道。可能是因为它与 Python 无关。
  • @danbgray:ORM 是在 Python 中操作的,但无论如何它都会生成 SQL。
  • 在 Python 3.x 中,reduce 已从内置函数移至 functools 模块
  • 这为我产生了重复的结果。这样,如果值/术语出现在不同的字段中,查询会多次返回相同的对象(每个字段一次)。如何解决?
【解决方案2】:

老问题,但为了进一步参考,我添加了这个:

在 django 1.10 中添加了SearchVector 类。

文档中的用法:

针对单个字段进行搜索非常棒,但具有局限性。我们正在搜索的 Entry 实例属于一个 Blog,它有一个 tagline 字段。要查询这两个字段,请使用 SearchVector:

>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-20
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-09-09
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多