如何在 Odoo 16 中对 Many2Many 字段使用 Group by
Many2many 字段与 Many2one 字段类似,因为它们在模型之间建立了新的关系。在Odoo 16中,您无法按 many2many 字段分组,因为可以使用 many2many 记录选择任何记录。当您使用 many2many 字段给出 group by 过滤器时,您将遇到断言错误。
介绍如何在 Odoo 16 中使用 Many2Many 字段组。
这里我将使用已经存在的 tag_ids many2many 字段。如下面的代码所示:
.py
tag_ids = fields.Many2many('crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id', string='Tags')
.xml
sale.order.view.list.inherit.module.name sale.order
可以使用 Many2many 字段进行 group_by 筛选。如果我们计算字段,这是可行的,但如果 many2many 字段中的值为 2,则它将以逗号 (,) 显示,如 tag1、tag2 等,因为它是一个字符字段。
.py
product_tags = fields.Char(string='Tags', compute='_get_tags', store=True) @api.model @api.depends('tag_ids') def _get_tags(self): for rec in self: if rec.tag_ids: product_tags = ','.join([p.name for p in rec.tag_ids]) else: product_tags = '' rec.product_tags = product_tags
.xml
sale.order.view.list.inherit.module.name sale.order
ale.order.view.form.inherit.module.name sale.order
这里我们添加了一个 Char 字段 product_tags。它是一个计算字段,将标签名称连接到该字段。
您可以看到我们在 XML 文件中提供了一个名为标签的分组过滤器。当我们尝试按这些销售订单分组时,它将显示在下面。
同样,我们可以为 many2many 字段添加 groupby。
接下来,让我们检查如何为 many2many 字段添加过滤器。
您可以创建一个替代 Many2Many 字段来计算来自 many2many 字段的值。我将提供一个例子来演示这一点。该字段必须指定 store=True。
.py
newfield_id = fields.Many2one('example_ids', compute=_compute_newfield_id, store=True) @api.depends('example_ids') def _compute_newfield_id(self): for record in self: record.newfield_id = record.example_ids and record.example_ids[0] or False
.xml
您可以根据需要提供域名,因为可以在已保存的字段中简单搜索。如果您愿意,可以包含位置的 xpath。
要了解有关在 Odoo 16 中的客户门户表单中创建多对多字段的更多信息