pic*_*mon 5 python django django-views
我正在尝试建立一个搜索系统,我想name, state, city,在我的django模型中搜索多个字段.我写了下面的代码,但我一直无法弄清楚如何去做.
楷模:
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)
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?由于某些个人原因,我不想使用haysatck.
编辑:刚刚注意到它只是 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>]
Run Code Online (Sandbox Code Playgroud)
要在多个字段中搜索相同的文本,您可以使用:
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)
Run Code Online (Sandbox Code Playgroud)
正如Robin Nemeth所建议的,如果您使用的是 postgres db,则可以使用 SearchVector,(我只是直接回答问题,请在django 文档中获取完整的详细信息。)
\n首先添加django.contrib.postgres到INSTALLED_APPS,有助于利用 PostgreSQL\xe2\x80\x99s 全文搜索引擎。
在搜索的views.py中,
\nfrom django.contrib.postgres.search import SearchVector\n\n\n# view function\ndef hup_find(request):\n search_vector = SearchVector(\'name\', \'state\', \'city\')\n\n if (\'q\' in request.GET) and request.GET[\'q\'].strip():\n query_string=request.GET[\'q\']\n seens = Findhall.objects.annotate(\n search=search_vector).filter(search=query_string)\n\n return render(request, \'find.html\', {\'seens\':seens})\nRun Code Online (Sandbox Code Playgroud)\n对于大型数据库,搜索过程需要一些时间,您可以使用 postgresql 的 GIN-(通用倒排索引)功能来提高性能,这些是官方文档之外的一些有用的链接,
\n发现了不同的方法,我认为Julien Phalip以一种更 Pythonish 的方式使用搜索,
\n