minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Os campos Many2many são semelhantes aos campos Many2one no sentido de que estabelecem novos relacionamentos entre modelos.existirOdoo 16 , não será possível agrupar por campos many2many porque qualquer registro pode ser selecionado usando muitos2many registros. Ao fornecer grupo por filtro usando o campo many2many, você obterá um erro de asserção.
Apresentando como usar o grupo de campos Many2Many no Odoo 16。
Aqui usarei o campo tag_ids many2many existente. Conforme mostrado no código a seguir:
.py
tag_ids = fields.Many2many('crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id', string='Tags')
.xml
- <record id="view_sales_order_filter" model="ir.ui.view">
- <field name="name">sale.order.view.list.inherit.module.name</field>
- <field name="model">sale.order</field>
- <field name="inherit_id" ref="sale.view_sales_order_filter"/>
- <field name="arch" type="xml">
- <xpath expr="//search/group/filter[@name='customer']" position="after">
- <separator/>
- <filter name="tag_ids" string="Tags" domain="[]" context="{'group_by': 'tag_ids'}"/>
- <separator/>
- </xpath>
- </field>
- </record>
Você pode usar o campo Many2many para filtragem group_by. Isso funciona se contarmos os campos, mas se o valor no campo many2many for 2, então ele será exibido com vírgula (,) como tag1, tag2, etc., porque é um campo de caractere.
.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
- <record id="view_sales_order_filter" model="ir.ui.view">
- <field name="name">sale.order.view.list.inherit.module.name</field>
- <field name="model">sale.order</field>
- <field name="inherit_id" ref="sale.view_sales_order_filter"/>
- <field name="arch" type="xml">
- <xpath expr="//search/group/filter[@name='customer']"
- position="after">
- <separator/>
- <filter name="tag_ids" string="Tags" domain="[]"
- context="{'group_by': 'product_tags'}"/>
- <separator/>
- </xpath>
- </field>
- </record>
- <record id="sale_view_form_custom" model="ir.ui.view">
- <field name="name">ale.order.view.form.inherit.module.name</field>
- <field name="model">sale.order</field>
- <field name="inherit_id" ref="sale.view_order_form"/>
- <field name="arch" type="xml">
- <xpath expr="//field[@name='payment_term_id']" position="after">
- <field name="product_tags"/>
- </xpath>
- </field>
- </record>
Aqui adicionamos um campo Char product_tags. É um campo calculado ao qual o nome do rótulo está concatenado.
Você pode ver que fornecemos um filtro de agrupamento chamado tag no arquivo XML. Quando tentarmos agrupar por esses pedidos de venda ele aparecerá abaixo.
Da mesma forma, podemos adicionar groupby para muitos2muitos campos.
A seguir, vamos verificar como adicionar um filtro para o campo many2many.
Você pode criar um campo Many2Many alternativo para calcular o valor do campo many2many. Vou dar um exemplo para demonstrar isso. Este campo deve especificar 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
<field name="newfield_id" string="Example" filter_domain="[(newfield_id,'ilike', self)]"/>
Você pode fornecer o nome de domínio, se necessário, pois ele pode ser facilmente pesquisado nos campos salvos. Você pode incluir o xpath do local, se desejar.
Para saber mais sobre como criar campos muitos para muitos em formulários do portal do cliente no Odoo 16