From f95af92ae3bc6bd7d7d4a9e09042bcca9f35ffec Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 13 Mar 2020 15:16:04 +0000 Subject: [PATCH] [FIX] website: perf - prefetch every website menus in one go Without this commit, the website menus would not be prefetch all in once. Thus, every call to `submenu` template (called recursively) would do SQL queries. One when accessing website.menu_id, then for every access on menu's child_ids. It would also make an extra request for groups since the menus have an ir.rule for that. with following structure, 13 SQL queries will be avoided, regardless if there is a group or not on the menus: - Top menu - Home - Contact us - Sub Contact us - Sub Sub Contact us Related to #47257 task-2211013 X-original-commit: 7fb016f9966bb5e2289ba17eacafb8887626514e --- addons/website/models/website.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index c8dd03d8107..270a6199c95 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -133,9 +133,18 @@ class Website(models.Model): self.default_lang_id = language_ids[0] def _compute_menu(self): - Menu = self.env['website.menu'] for website in self: - website.menu_id = Menu.search([('parent_id', '=', False), ('website_id', '=', website.id)], order='id', limit=1).id + menus = self.env['website.menu'].search([('website_id', '=', website.id)]) + + # use field parent_id (1 query) to determine field child_id (2 queries by level)" + for menu in menus: + menu._cache['child_id'] = () + for menu in menus: + # don't add child menu if parent is forbidden + if menu.parent_id and menu.parent_id in menus: + menu.parent_id._cache['child_id'] += (menu.id,) + + website.menu_id = menus and menus.filtered(lambda m: not m.parent_id)[0].id or False @api.model def create(self, vals):