按名称查找多级类别的 ID

find by name the id of a multi level categorie

我的主要问题是如何按名称搜索给定类别的 ID,让我解释一下,所以,在我的数据库中,我有一个名为 product_category 的 table,其中存储了一个 5级别类别。让我们举个例子:

id name parent_id
1 A
2 B 1
3 C 2
4 D
5 A 4
6 B 5
7 C 6

所以从这个 table 让我们来看看这两个类别:

在我的 table 中,类别名称是多余的,但没有相同的 ID,现在假设我想搜索此类别的 ID (A/B/C),是否可以在我的情况下?知道有两个名为 C 的类别具有不同的 id,与 B 和 A 相同。

我正在使用 python 和 odoo,但我没有找到解决这个问题的方法,尤其是在我的数据库中有多余的名称。

您可以使用递归查询为每个类别构建完整路径,然后在最终 select:

中过滤该完整路径
with recursive tree as (
  select id, name, parent_id, name as full_path
  from category 
  where parent_id is null
  union all
  select c.id, c.name, c.parent_id, concat(p.full_path, '/', c.name) as full_path
  from category  c
    join tree p on p.id = c.parent_id
)
select id, name, parent_id
from tree
where full_path = 'A/B/C'

complete_name 字段是存储的计算字段,因此可用于搜索域。

示例(odoo 15):

self.env['product.category'].search([('complete_name', '=', 'A / B / C')])

示例(odoo 8):

self.env['product.category'].search([('name', '=', 'C'), ('parent_id.name', '=', 'B'), ('parent_id.parent_id.name', '=', 'A'), ('parent_id.parent_id.parent_id', '=', False)])