按名称查找多级类别的 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 让我们来看看这两个类别:
- A/B/C
- D/A/B/C
在我的 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)])
我的主要问题是如何按名称搜索给定类别的 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 让我们来看看这两个类别:
- A/B/C
- D/A/B/C
在我的 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)])