Бэкэнд поиска Wagtail PostgreSQL показывает предупреждение "MyModel.search_fields содержит несуществующее поле", но полностью функционален и работает должным образом.
Привет заранее спасибо за вашу помощь!
В проекте трясогузки 2.2.2 я недавно добавил функцию поиска с помощью серверной части поиска PostgreSQL. Он отлично работал, пока я не попытался выполнить поиск по отфильтрованномуPageQuerySet
по заданному тегу, который вызывает эту ошибку:
FilterFieldError at /blog/tags/tag_slug/
Cannot filter search results with field "tag_id". Please add index.FilterField('tag_id') to BlogPost.search_fields.
Django Version: 2.0.13
Python Version: 3.6.8
...
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/queryset.py" in search
12. operator=operator, order_by_relevance=order_by_relevance, partial_match=partial_match)
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in search
371. partial_match=partial_match,
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in _search
359. search_query.check()
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in check
157. self._get_filters_from_where_node(self.queryset.query.where, check_only=True)
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in _get_filters_from_where_node
108. child_filters = [self._get_filters_from_where_node(child) for child in where_node.children]
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in <listcomp>
108. child_filters = [self._get_filters_from_where_node(child) for child in where_node.children]
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in _get_filters_from_where_node
100. return self._process_filter(field_attname, lookup, value, check_only=check_only)
File "/path/to/env/lib/python3.6/site-packages/wagtail/search/backends/base.py" in _process_filter
73. field_name=field_attname
Exception Type: FilterFieldError at /trust-worthy/tags/presentation/
Exception Value: Cannot filter search results with field "tag_id". Please add index.FilterField('tag_id') to BlogPost.search_fields.
Я добавил FilterField
в модель BlogPost search_fields, как было сказано, и, похоже, она отлично работает с правильными результатами поиска, возвращаемыми в отфильтрованном наборе. Единственная проблема сейчас в том, что каждый раз, когда Django загружается, он показывает это предупреждение:
System check identified some issues:
WARNINGS:
blog.BlogPost: BlogPost.search_fields contains non-existent field 'tag_id'
Вот краткое описание того, как настраиваются соответствующие модели:
from wagtail.core.models import Page
from wagtail.search import index
from taggit.models import Tag, TaggedItemBase
from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey
class BlogIndex(Page):
get_context(self, request):
context = super().get_context(request)
tag = Tag.objects.get(slug=some_tag_slug)
pages = BlogPost.objects.descendant_of(self)\
.live().public().order_by('-date')
# The above <PageQuerySet> works fine to search
# until I add this valid working filter:
pages = pages.filter(tags=tag)
# ...which causes the original error when searching that is
# fixed by adding `tag_id` FilterField to BlogPost.search_fields
pages = pages.search(some_search_query)
# `pages` is now valid <PostgresSearchResults>
context['pages'] = pages
return context
class BlogPostTag(TaggedItemBase):
content_object = ParentalKey('blog.BlogPost', related_name='tagged_items')
class BlogPost(Page):
search_fields = Page.search_fields + [
index.FilterField('tag_id'), # This fixes the error but causes the warning
]
tags = ClusterTaggableManager(through=BlogPostTag, blank=True)
У меня вопрос - что я делаю не так, чтобы вызвать предупреждение о несуществующем поле? Теперь поиск в отфильтрованном списке работает нормально, но верно и то, чтоtag_id
не является полем в модели BlogPost. Есть ли другой способ исправитьCannot filter search results
ошибка и получите тот же результат?