即使 Django 不支持 postgresql 中的 ts_headline 功能,您也可以手动将其作为 Function 应用到 QuerySet 上进行注释:
我们需要额外的函数来操作 django ORM。这是 ts_headline 的示例。 [此示例函数的 original_source 已链接here]
标题函数示例:
from django.db import models
from django.contrib.postgres.search import Value, Func
class Headline(Func):
function = 'ts_headline'
def __init__(self, field, query, config=None, options=None, **extra):
expressions = [field, query]
if config:
expressions.insert(0, Value(config))
if options:
expressions.append(Value(options))
extra.setdefault('output_field', models.TextField())
super().__init__(*expressions, **extra)
使用上面的函数你可以在QuerySet上使用它来注解
示例模型定义
class Video(Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=128, verbose_name="Title")
在模型标题上获得突出显示的搜索结果的步骤
- 过滤得到需要注解的QuerySet
- 使用标题功能注释
- 获取文档的值
过滤对象
Video.objects.filter(filter_query)
filter_query 是一个 Q() over title
filter_query = Q(title__contains=term)
标题数据注释
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query))
ts_headline 直接从文档而不是从 ts_vector 中获取输入,因此我们必须传递有关它应该访问哪个字段以及应该对其执行什么 SearchQuery 的信息。
text_Search_query 是 SearchQuery 对象,其输入与 filter_query 相同
text_search_query = SearchQuery(词条)
现在在注释之后,这个查询集在所有名为 title_highlight 的对象中包含一个额外的字段,其中包含您想要的结果:
these <b>loans</b> not being repaired
从注释字段中获取值
在 QuerySet 上使用 values_list,您可以从这些带注释的字段中获取值。
最终代码:
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query)).values_from('title','title_highlight')