Проблема с тестами Django и триграммным сходством
У меня есть приложение Django, которое выполняет полнотекстовый поиск по базе данных. Представление, которое выполняет этот запрос, является моим search_view
(я опускаю некоторые части для простоты). Оно просто получает результаты поиска на моей модели Post
и отправляет в шаблон:
def search_view(request):
posts = m.Post.objects.all()
query = request.GET.get('q')
search_query = SearchQuery(query, config='english')
qs = Post.objects.annotate(
rank=SearchRank(F('vector_column'), search_query) + TrigramSimilarity('post_title', query)
).filter(rank__gte=0.15).order_by('-rank'), 15
)
context = {
results = qs
}
return render(request, 'core/search.html', context)
Приложение работает просто отлично. Проблема заключается в тесте, который я создал. Вот мой tests.py
:
class SearchViewTests(TestCase):
def test_search_without_results(self):
"""
If the user's query did not retrieve anything
show him a message informing that
"""
response = self.client.get(reverse('core:search') + '?q=eksjeispowjskdjies')
self.assertEqual(response.status_code, 200)
self.assertContains(response.content, "We didn\'t find anything on our database. We\'re sorry")
Этот тест вызывает ProgrammingError
исключение:
django.db.utils.ProgrammingError: function similarity(character varying, unknown) does not exist
LINE 1: ...plainto_tsquery('english'::regconfig, 'eksjeispowjskdjies')) + SIMILARITY...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Я очень хорошо понимаю это исключение, потому что иногда получаю его. Функция SIMILARITY
в Postgres принимает два аргумента, и оба должны быть типа TEXT
. Исключение возникает потому, что второй аргумент (мой термин запроса) имеет тип UNKNOWN
, поэтому функция не работает, и Django выдает исключение. И я не понимаю, почему, ведь на самом деле поиск работает! Даже в оболочке он работает отлично:
In [1]: from django.test import Client
In [2]: c = Client()
In [3]: response = c.get(reverse('core:search') + '?page=1&q=eksjeispowjskdjies')
In [4]: response
Out[4]: <HttpResponse status_code=200, "text/html; charset=utf-8">
Есть идеи, почему тест не работает, но фактическое выполнение приложения работает и консольный тест тоже работает?