Использование Django-modeltranslation в сочетании с PostgreSQL SearchVector

Я использую 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')

to:

vector = SearchVector('name_de')

Тогда поиск работает по правильному полю. Есть ли способ передать правильное поле в SearchVector?

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')
Вернуться на верх