结合使用Django-modeltranslation和PostgreSQL SearchVector

fquxozlt  于 2023-05-01  发布在  Go
关注(0)|答案(2)|浏览(115)

我使用django-modeltranslation来转换模型字段。假设我有以下模型(其中名称在DB中被翻译):

class Book(models.Model):
    name = models.CharField(max_length=90)

然后,在DRF视图中,我有一个端点,它接受一个查询文本,并使用以下代码搜索书名:

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank

class BookView(APIView):

    def get(self, request):
        q = request.get('q')
        vector = SearchVector('name') # this is where the issue is
        query = SearchQuery(q)
        matches = Book.objects.annotate(rank=SearchRank(vector, query))\
                      .filter(rank__gt=0.1)\
                      .order_by('-rank')
        # etc.

当我只使用英语工作时,这很好用。但是现在我添加了一种新的语言,本地化的各个方面都工作得很好,除了这个搜索。它只查看name_en字段值。
例如,如果目标语言是德语,我显式地将下面的行从:

vector = SearchVector('name')

致:

vector = SearchVector('name_de')

然后在正确的字段上搜索。有没有办法将正确的字段传递给SearchVector

b91juud3

b91juud31#

IIUC,你可以使用get_language()

from django.utils.translation import get_language
from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank

class BookView(APIView):

    def get(self, request):
        q = request.get('q')
        vector = SearchVector(f'name_{get_language()}')
        query = SearchQuery(q)
        matches = Book.objects.annotate(rank=SearchRank(vector, query))\
                      .filter(rank__gt=0.1)\
                      .order_by('-rank')
frebpwbc

frebpwbc2#

我还将语言配置添加到ordeer中的查询中,以使其“意识到”语言。

query= SearchQuery(q,config="your_lang",search_type='websearch')

相关问题