Мульти-сайт Wagtail с упругим поиском ограничивает результаты поиска только одним сайтом - PullRequest
0 голосов
/ 26 ноября 2018

Похоже, что страница трясогузки не знает, к какому сайту она относится при использовании нескольких сайтов.Это проблема, когда я хочу контролировать, сколько сайтов мультисайта я просматриваю.

Вот таблица sql таблицы wagtailcore_page (без упоминания site_id):

CREATE TABLE "wagtailcore_page" ("id" integer NOT NULL PRIMARY KEY 
AUTOINCREMENT, "path" varchar(255) NOT NULL UNIQUE, "depth" integer unsigned 
NOT NULL, "numchild" integer unsigned NOT NULL, "title"
varchar(255) NOT NULL, "slug" varchar(255) NOT NULL, "live" bool NOT NULL, 
"has_unpublished_changes" bool NOT NULL, "url_path" text NOT NULL, 
"seo_title" varchar(255) NOT NULL, "show_in_menus" bool NOT NULL
 , "search_description" text NOT NULL, "expire_at" datetime NULL, "expired" 
bool NOT NULL, "content_type_id" integer NOT NULL REFERENCES 
"django_content_type" ("id"), "owner_id" integer NULL REFERENCES "auth_
user" ("id"), "locked" bool NOT NULL, "latest_revision_created_at" datetime 
NULL, "first_published_at" datetime NULL, "go_live_at" datetime NULL);

Сайты знают только свою корневую страницу - таблица wagtailcore_site:

CREATE TABLE "wagtailcore_site" ("id" integer NOT NULL PRIMARY KEY 
AUTOINCREMENT, "hostname" varchar(255) NOT NULL, "port" integer NOT NULL, 
"is_default_site" bool NOT NULL, "site_name" varchar(255)
NULL, "root_page_id" integer NOT NULL REFERENCES "wagtailcore_page" ("id"));

Решения:

  1. Вы можете иметь родительский класс для всех страниц определенного сайта, а затем выполнять поиск на этомтолько классЧто если я использую типы страниц на разных сайтах?

  2. Вы можете вызывать page.get_site () для всех результатов после выполнения эластичного поиска - это неэффективно.https://docs.wagtail.io/en/v1.10.1/reference/pages/model_reference.html#wagtail.wagtailcore.models.Page.get_site

Под капотом get_site в конечном счете вызывает этот метод, который неэффективен.

def get_url_parts(self):
    """
    Determine the URL for this page and return it as a tuple of
    ``(site_id, site_root_url, page_url_relative_to_site_root)``.
    Return None if the page is not routable.

    This is used internally by the ``full_url``, ``url``, ``relative_url``
    and ``get_site`` properties and methods; pages with custom URL routing
    should override this method in order to have those operations return
    the custom URLs.
    """
    for (site_id, root_path, root_url) in Site.get_site_root_paths():
        if self.url_path.startswith(root_path):
            page_path = reverse('wagtail_serve', args=(self.url_path[len(root_path):],))

            # Remove the trailing slash from the URL reverse generates if
            # WAGTAIL_APPEND_SLASH is False and we're not trying to serve
            # the root path
            if not WAGTAIL_APPEND_SLASH and page_path != '/':
                page_path = page_path.rstrip('/')

            return (site_id, root_url, page_path)
Итак, мое решение будет - добавить поле my_site_id для всех моих пользовательских моделей страниц, чтобы я мог фильтровать my_site_id перед поиском вasticsearch.Мне придется переопределить сохранение страницы, чтобы установить правильный my_site_id при создании и обновлении страниц.Это позволит мне искать страницы только для 1 сайта или искать страницы, например, 2 сайтов из 3.

Кто-нибудь знает лучший способ управления поиском по сайтам в трясогузке?-site

...