Wagtail search_fields на сниппете с внешним ключом
У меня есть сниппет, который является прокси одной из моих стандартных моделей django. search_fields отлично работает при фильтрации по стандартным полям, проблема в том, что я не могу заставить работать внешние ключи. На этой странице внизу есть пример, который показывает, как создавать поисковые сниппеты: https://docs.wagtail.org/en/stable/topics/snippets.html
В основной модели есть поле "day", которое является внешним ключом к таблице Day. У дня есть calendar_year, по которому я хотел бы иметь возможность фильтровать при поиске в области фрагментов wagtail. В методе def str я могу отобразить имя в списке, поиск является проблемой.
Предложения?
@register_snippet
class EventSnippet(index.Indexed, Event):
# We make a proxy model just to be able to add to this file or potentially if we want custom methods on it.
panels = [
FieldPanel('name'),
]
search_fields = [
index.SearchField('day__calendar_year', partial_match=True), # This prompts an error
index.SearchField('name', partial_match=True),
]
class Meta:
proxy = True
def __str__(self):
return f"{self.name} {self.day.calendar_year}"
При запуске python manage.py update_index я получаю следующее предупреждение:
EventSnippet.search_fields contains non-existent field 'day__calendar_year
Вы не можете использовать сложный поиск с двойными индексами внутри SearchField
- поисковые запросы работают путем заполнения центральной таблицы (поискового индекса) заранее данными, по которым вы собираетесь искать, что означает, что вы не можете делать произвольный поиск и преобразования в ней, как в стандартном запросе к базе данных.
Однако вы можете использовать любой метод или атрибут в SearchField - не только поля базы данных - поэтому вы можете добавить метод, который возвращает год, и использовать его:
@register_snippet
class EventSnippet(index.Indexed, Event):
# ...
def get_year(self):
return self.day.calendar_year
search_fields = [
index.SearchField('get_year', partial_match=True),
index.SearchField('name', partial_match=True),
]