Django 1.10 跨多个字段的全文搜索。如何获取不同的记录

postgresqlDjango

1个回答

写回答

Django
Django

使用Django 1.10实现跨多个字段的全文搜索

Django 1.10及以上的版本中,可以使用SearchVector和SearchQuery来实现跨多个字段的全文搜索。这些功能使得在数据库中进行全文搜索变得非常简单和高效。

首先,我们需要在models.py文件中定义我们要搜索的模型。假设我们有一个名为"Article"的模型,其中包含"title"和"content"两个字段,我们希望能够对这两个字段进行全文搜索。

Python

from Django.db import models

from Django.contrib.postgres.search import SearchVectorField

class Article(models.Model):

title = models.CharField(max_length=100)

content = models.TextField()

search_vector = SearchVectorField(null=True)

def save(self, *args, <strong>kwargs):

super().save(*args, </strong>kwargs)

Article.objects.filter(id=self.id).update(search_vector=SearchVector('title', 'content'))

在上述代码中,我们使用了SearchVectorField来存储全文搜索的结果。在保存模型实例时,我们通过覆盖save()方法来更新search_vector字段的值,使用SearchVector函数来指定要搜索的字段。

接下来,我们需要在视图函数中实现全文搜索的功能。假设我们有一个名为"search_articles"的视图函数,用于接收用户输入的搜索关键字,并返回匹配的文章列表。

Python

from Django.contrib.postgres.search import SearchQuery

def search_articles(request):

query = request.GET.get('query')

articles = Article.objects.annotate(search=SearchVector('title', 'content')).filter(search=SearchQuery(query))

return render(request, 'search_results.html', {'articles': articles})

在上述代码中,我们首先获取用户输入的搜索关键字,然后使用annotate()方法来创建一个名为"search"的注释,该注释将SearchVector应用于"title"和"content"字段。接下来,我们使用filter()方法来过滤出与搜索关键字匹配的文章。

最后,我们可以在模板文件search_results.html中展示搜索结果。

html

{% for article in articles %}

<h3>{{ article.title }}</h3>

{{ article.content }}

{% empty %}

<img src="https://img.izhida.com/topic/a7f5f35426b927411fc9231b56382173.jpg" alt="Python"><br>Python

No articles found.

{% endfor %}

通过以上步骤,我们就可以实现在Django 1.10中跨多个字段进行全文搜索的功能了。

案例代码

Python

# models.py

from Django.db import models

from Django.contrib.postgres.search import SearchVectorField

class Article(models.Model):

title = models.CharField(max_length=100)

content = models.TextField()

search_vector = SearchVectorField(null=True)

def save(self, *args, <strong>kwargs):

super().save(*args, </strong>kwargs)

Article.objects.filter(id=self.id).update(search_vector=SearchVector('title', 'content'))

Python

# views.py

from Django.contrib.postgres.search import SearchQuery

def search_articles(request):

query = request.GET.get('query')

articles = Article.objects.annotate(search=SearchVector('title', 'content')).filter(search=SearchQuery(query))

return render(request, 'search_results.html', {'articles': articles})

html

<!-- search_results.html -->

{% for article in articles %}

<h3>{{ article.title }}</h3>

{{ article.content }}

{% empty %}

No articles found.

{% endfor %}

在上述代码中,我们展示了如何在Django 1.10中实现跨多个字段的全文搜索,并在模板中展示搜索结果。你可以根据自己的需求进行修改和扩展。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号