Использование 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')