Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Los campos Many2many son similares a los campos Many2one en que establecen nuevas relaciones entre modelos.existirOdoo 16 , no puede agrupar por muchos2many campos porque se puede seleccionar cualquier registro usando muchos2many registros. Cuando proporciona grupo por filtro usando el campo many2many, obtendrá un error de afirmación.
Presentamos cómo usar el grupo de campos Many2Many en Odoo 16。
Aquí usaré el campo tag_ids many2many existente. Como se muestra en el siguiente código:
.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>
Puede utilizar el campo Many2many para filtrar group_by. Esto funciona si contamos los campos, pero si el valor en el campo muchos2muchos es 2, entonces se mostrará con una coma (,) como etiqueta1, etiqueta2, etc. porque es un campo de caracteres.
.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>
Aquí hemos agregado un campo Char product_tags. Es un campo calculado al que se concatena el nombre de la etiqueta.
Puede ver que hemos proporcionado un filtro de agrupación llamado etiqueta en el archivo XML. Cuando intentemos agrupar por estos pedidos de venta, aparecerá a continuación.
De manera similar, podemos agregar groupby para muchos2muchos campos.
A continuación, veamos cómo agregar un filtro para el campo many2many.
Puede crear un campo Many2Many alternativo para calcular el valor del campo many2many. Proporcionaré un ejemplo para demostrar esto. Este campo debe 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)]"/>
Puede proporcionar el nombre de dominio si es necesario, ya que se puede buscar fácilmente en los campos guardados. Puede incluir el xpath de la ubicación si lo desea.
Para saber más sobre la creación de campos de muchos a muchos en los formularios del portal de clientes en Odoo 16