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),
    ]
Вернуться на верх