我目前有一个Django应用程序和postgres数据库。我想要一个允许用户输入值的搜索栏,它将搜索模型的某些字段以搜索匹配的值。我希望即使对于“”值也可以使用。我目前有:
MyModel.objects.filter(myfield__icontains=search_query).order_by(...)
我该怎么做,以便它可以同时搜索模型的多个字段。这样做最有效的方法是什么?这样“包含”可以吗?
任何帮助将不胜感激!
答案 0 :(得分:2)
您可以使用Q
搜索多个字段,例如:
您要搜索的字段:
field0
field1
field2
Django搜索代码:
from django.db.models import Q
search_result = MyModel.objects.filter(
Q(field0_icontains=search_query) |
Q(field1_icontains=search_query) |
Q(field2_icontains=search_query)
).order_by(...)
答案 1 :(得分:0)
不建议通过常规的过滤器查询和icontains
来执行此操作,因为它很快会变得效率低下-您当然不希望在多个大型文本字段上执行此操作。
但是,PostgreSQL带有full text search engine,它正是为此目的而设计的。 Django provides support for this。
您可以定义SearchVector
来一次对多个字段执行全文搜索,例如:
from django.contrib.postgres.search import SearchVector
MyModel.objects.annotate(
search=SearchVector('field_1') + SearchVector('field_2'),
).filter(search='search_query')
我链接到的文档提供了有关如何对搜索结果进行排名等更多信息。
另一种替代方法是使用像Elasticsearch这样的搜索引擎-是否必要取决于您有多少个对象以及需要对结果进行哪种过滤和排名。