我正在尝试构建一个搜索系统,我想在我的django模型中搜索多个字段name, state, city,
。我写了下面的代码,但我一直无法弄清楚如何去做。
型号:
class Finhall(models.Model):
user=models.ForeignKey(User)
name=models.CharField(max_length=250, unique=True)
address=models.CharField(max_length=200)
city=models.CharField(max_length=200)
state=models.CharField(max_length=200)
def __unicode__(self):
return u'%s' % (self.name)
Views.py
def hup_find(request):
if ('q' in request.GET) and request.GET['q'].strip():
query_string=request.GET.get('q')
seens=Finhall.objects.filter(name__icontains=query_string)
else:
seens=None
return render_to_response('find.html',{'seens':seens},context_instance=RequestContext(request))
模板:
{% block content %}
<body>
<form action="" method="GET">
<input type="text" name="q" />
<button type="submit">search</button>
</form>
{% for seen in seens %}
<p> {{seen.name}}</p>
{% empty %}
<p> no search </p>
{% endfor %}
</body>
{% endblock %}
我该如何解决这个问题?由于某些个人原因,我不想使用haysatck。
答案 0 :(得分:6)
您可以使用django Q
对象进行OR
查询,
或者如果您想要AND
一起查询,只需将当前查找用作kwargs
seens=Finhall.objects.filter(name__icontains=query_string, address__icontains=query_string)
您应该考虑使用全文搜索或haystack
(这使搜索变得简单),因为icontains
会发布不可远程扩展的%LIKE%
答案 1 :(得分:4)
编辑:刚刚发现它只是Postgres
显然在django 1.10 SearchVector课程中已添加。
来自文档的用法:
针对单个字段进行搜索非常有用,但相当有限。我们正在搜索的Entry实例属于Blog,它有一个标语字段。要查询这两个字段,请使用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>]
答案 2 :(得分:1)
要在多个字段中搜索相同的文字,您可以使用:
from django.db.models import Q
class SearchAPI(APIView):
def get(self, request, search_text, format=None, **kwargs):
Model.objects.filter(Q(search_tags__contains=search_text) | Q(auto_tags__contains=search_text)
答案 3 :(得分:0)
根据Robin Nemeth的建议,如果您使用的是postgres db,则可以使用SearchVector,(我是直接回答这个问题,请在django documentation中获取完整的详细信息。)
首先将django.contrib.postgres
添加到INSTALLED_APPS
,以帮助利用PostgreSQL的全文本搜索引擎。
在搜索的views.py中,
from django.contrib.postgres.search import SearchVector
# view function
def hup_find(request):
search_vector = SearchVector('name', 'state', 'city')
if ('q' in request.GET) and request.GET['q'].strip():
query_string=request.GET['q']
seens = Findhall.objects.annotate(
search=search_vector).filter(search=query_string)
return render(request, 'find.html', {'seens':seens})
对于大型数据库,搜索过程需要一些时间,您可以使用postgresql的GIN-(广义倒排索引)功能来提高性能,这些是除官方documentation之外的有用链接,
找到了不同的方法,我认为Julien Phalip以一种更加蟒蛇般的方式进行搜索,