Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有第三方应用程序的情况下搜索django模型的多个字段_Django_Search_Django Models - Fatal编程技术网

在没有第三方应用程序的情况下搜索django模型的多个字段

在没有第三方应用程序的情况下搜索django模型的多个字段,django,search,django-models,Django,Search,Django Models,我在django应用程序中有一个模型,我想为它创建一个搜索表单。是否有一种方法可以使用相同的搜索字符串同时搜索模型中的所有字段?我已经研究过xapian和solr,但是搜索超过1个模型似乎需要很大的开销。我想说一些类似的话: results = Assignment.objects.filter(any_column = search_string) 我意识到可能没有那么简洁的东西,但现在除了使用搜索应用程序之外,我能想到的唯一选择是单独检查每个字段,并将结果连接在一起。一旦你拥有了所有可以创

我在django应用程序中有一个模型,我想为它创建一个搜索表单。是否有一种方法可以使用相同的搜索字符串同时搜索模型中的所有字段?我已经研究过xapian和solr,但是搜索超过1个模型似乎需要很大的开销。我想说一些类似的话:

results = Assignment.objects.filter(any_column = search_string)
我意识到可能没有那么简洁的东西,但现在除了使用搜索应用程序之外,我能想到的唯一选择是单独检查每个字段,并将结果连接在一起。

一旦你拥有了所有可以创建的内容,你就可以使用并使用它们将其转换为单个查询

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

旧问题,但为了进一步参考,我补充如下:

在django中,添加了1.10类

文档中的用法:

针对单个领域进行搜索是很好的,但相当有限。我们正在搜索的条目实例属于一个博客,它有一个标语字段。要查询这两个字段,请使用SearchVector:

>>来自django.contrib.postgres.search导入SearchVector
>>>Entry.objects.annotate(
…search=SearchVector('body\u text','blog\u tagline'),
…).filter(search='Cheese')
[, ]

reduce()
带有
运算符。或
Q
对象和kwarg展开。您能用两个字段演示一个简单的示例吗?我试着在django文档中查找reduce()函数,但找不到它。我不得不在Q(…)对象周围添加括号,但除此之外,效果非常好!非常感谢。这类东西在django没有成为捷径有什么原因吗。你会认为搜索像这样的简单模型,使用像我的初始示例这样的语法是一个很好的工具,对吗?不知道。可能是因为它与Python无关。@danbgray:ORM在Python中操作,但无论如何它都会生成SQL。在Python 3.x中,reduce从内置函数移到functools模块,这为我生成了重复的结果。这样,如果值/术语出现在不同的字段中,查询将多次返回同一对象(每个字段一次)。如何解决这个问题?
>>> 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>]