在Django中搜索表的所有字段

6 投票
3 回答
10517 浏览
提问于 2025-04-15 16:47

如何在Django中使用过滤条件搜索表中的所有字段,比如:table.object.filter(表中的任意字段="某个值")

谢谢。

3 个回答

2

编辑:刚注意到这个功能只适用于Postgres数据库

这是个老问题,不过为了后续参考:

在django 1.10版本中,添加了一个叫做SearchVector的类。

文档中的用法:

在一个字段上搜索是很不错的,但也有点局限。我们要搜索的Entry实例属于一个博客,而这个博客有一个标签字段。要同时查询这两个字段,可以使用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>]
4

我觉得过滤条件不太适合这种搜索方式。你可以看看Haystack这个工具。

20

我同意Alasdair的看法,不过你问题的答案是这样的:

from django.db.models import CharField
from django.db.models import  Q

fields = [f for f in table._meta.fields if isinstance(f, CharField)]
queries = [Q(**{f.name: SEARCH_TERM}) for f in fields]

qs = Q()
for query in queries:
    qs = qs | query

table.objects.filter(qs)

注意:我没有测试过这段代码,但它应该能让你离目标更近一些。

撰写回答