Джанго триграмма

Я пытался реализовать функциональность trigram_s Similar в моем бэкэнд-коде Django. Я получаю ошибку

web_1 | Traceback (последний вызов был последним):

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", строка 41, во внутреннем

web_1 | response = get_response(запрос)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", строка 187, в _get_response

web_1 | response = self.process_exception_by_middleware (e, запрос)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", строка 185, в _get_response

web_1 | response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", строка 58, в wrapped_view

web_1 | вернуть view_func (* args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", строка 68, в поле зрения

web_1 | вернуть self.dispatch(запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", строка 489, в отправке

web_1 | response = self.handle_exception (exc)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", строка 449, в handle_exception

web_1 | self.raise_uncaught_exception (возб)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", строка 486, в отправке

web_1 | response = обработчик (запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/generics.py", строка 201, в get

web_1 | вернуть self.list(запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/mixins.py", строка 40, в списке

web_1 | queryset = self.filter_queryset (self.get_queryset ())

web_1 | Файл "/usr/local/lib/python3.6/site-packages/profilehooks.py", строка 239, в new_fn

web_1 | return fp (* args, ** kw)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/profilehooks.py", строка 347, в вызове

web_1 | возвращение profiler.runcall (self.fn, * args, ** kw)

web_1 | Файл "/usr/local/lib/python3.6/cProfile.py", строка 109, в runcall

web_1 | return func (* args, ** kw)

web_1 | Файл "/code/src/users/views.py", строка 266, в filter_queryset

web_1 | major__name__trigram_s Similar = "CS"

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", строка 784, в фильтре

web_1 | вернуть self._filter_or_exclude (False, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", строка 802, в _filter_or_exclude

web_1 | clone.query.add_q (Q (* args, ** kwargs))

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/sql/query.py", строка 1250, в add_q

web_1 | предложение, _ = self._add_q (q_object, self.used_aliases)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/sql/query.py", строка 1276, в _add_q

web_1 | allow_joins = allow_joins, split_subq = split_subq,

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/sql/query.py", строка 1210, в build_filter

web_1 | condition = self.build_lookup (lookups, col, value)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/sql/query.py", строка 1102, в build_lookup

web_1 | lhs = self.try_transform (lhs, name, lookups)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/db/models/sql/query.py", строка 1120, в try_transform

web_1 | (name, lhs.output_field.class.name))

web_1 | django.core.exceptions.FieldError: Неподдерживаемый поиск trigram_s Аналогичный для CharField или присоединение к полю не допускается.

web_1 | 2018-11-11 19: 03: 58,144 ОШИБКА Внутренняя ошибка сервера: / mentors /

web_1 | Traceback (последний вызов был последним):

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", строка 41, во внутреннем

web_1 | response = get_response(запрос)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", строка 187, в _get_response

web_1 | response = self.process_exception_by_middleware (e, запрос)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", строка 185, в _get_response

web_1 | response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", строка 58, в wrapped_view

web_1 | вернуть view_func (* args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", строка 68, в поле зрения

web_1 | вернуть self.dispatch(запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", строка 489, в отправке

web_1 | response = self.handle_exception (exc)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / rest_framework / views.py", строка 449, в handle_exception

web_1 | self.raise_uncaught_exception (возб)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / rest_framework / views.py", строка 486, в отправке

web_1 | response = обработчик (запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / rest_framework / generics.py", строка 201, в get

web_1 | вернуть self.list(запрос, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / rest_framework / mixins.py", строка 40, в списке

web_1 | queryset = self.filter_queryset (self.get_queryset ())

web_1 | Файл "/usr/local/lib/python3.6/site- packages / profilehooks.py", строка 239, в new_fn

web_1 | return fp (* args, ** kw)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / profilehooks.py", строка 347, в вызове

web_1 | возвращение profiler.runcall (self.fn, * args, ** kw)

web_1 | Файл "/usr/local/lib/python3.6/cProfile.py", строка 109, в runcall

web_1 | return func (* args, ** kw)

web_1 | Файл "/code/src/users/views.py", строка 266, в filter_queryset

web_1 | major__name__trigram_s Similar = "CS"

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / query.py", строка 784, в фильтре

web_1 | вернуть self._filter_or_exclude (False, * args, ** kwargs)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / query.py", строка 802, в _filter_or_exclude

web_1 | clone.query.add_q (Q (* args, ** kwargs))

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / sql / query.py", строка 1250, в add_q

web_1 | предложение, _ = self._add_q (q_object, self.used_aliases)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / sql / query.py", строка 1276, в _add_q

web_1 | allow_joins = allow_joins, split_subq = split_subq,

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / sql / query.py", строка 1210, в build_filter

web_1 | condition = self.build_lookup (lookups, col, value)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / sql / query.py", строка 1102, в build_lookup

web_1 | lhs = self.try_transform (lhs, name, lookups)

web_1 | Файл "/usr/local/lib/python3.6/site- packages / django / db / models / sql / query.py", строка 1120, в try_transform

web_1 | (name, lhs.output_field.class.name))

web_1 | django.core.exceptions.FieldError: Неподдерживаемый поиск 'trigram_s Similar' для CharField или объединение в поле не разрешено.

Я следовал инструкциям на этой странице https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/lookups/ но безрезультатно. Я правильно установил зависимости и добавил дополнительные файлы.

 for item in query:
                 item_alias = trans_dict.get(item.lower(),item)
                 major_alias = major_dict.get(item.lower(),item)
                 queryset = queryset.filter(
                     major__name__trigram_similar = major_alias
                 )

SOS!

1 ответ

В trigram_similarlookup позволяет выполнять поиск триграмм, измеряя количество общих триграмм (три последовательных символа), используя специальное расширение PostgreSQL. Поиск по триграмме получает выражение и возвращает результаты, для которых показатель сходства превышает текущий порог подобия.

Чтобы использовать его, добавьте ' django.contrib.postgres' в твоей INSTALLED_APPS и активируйте pg_trgmрасширение на PostgreSQL. Вы можете установить расширение, используя TrigramExtension миграционная операция.

Вам необходимо создать новую пустую миграцию для app.model в вопросе со следующим:

      from django.contrib.postgres.operations import TrigramExtension

class Migration(migrations.Migration):
    operations = [
        TrigramExtension(),
    ]

Все это нужно делать вручную (не забудьте сохранить там зависимости).

      python manage.py makemigrations <insert_app_name_here> --empty 

** NB. Стоит отметить, что серверная часть вашей базы данных должна поддерживать PostgreSQL ...

Другие вопросы по тегам