2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Les champs Many2many sont similaires aux champs Many2one dans le sens où ils établissent de nouvelles relations entre les modèles.existerOdoo 16 , vous ne pouvez pas regrouper par plusieurs champs car n'importe quel enregistrement peut être sélectionné à l'aide de plusieurs enregistrements. Lorsque vous donnez un groupe par filtre en utilisant le champ many2many, vous obtiendrez une erreur d'assertion.
Présentation de l'utilisation du groupe de champs Many2Many dans Odoo 16。
Ici, j'utiliserai le champ tag_ids many2many existant. Comme indiqué dans le code suivant :
.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>
Vous pouvez utiliser le champ Many2many pour le filtrage group_by. Cela fonctionne si nous comptons les champs, mais si la valeur du champ many2many est 2, alors il sera affiché avec une virgule (,) comme tag1, tag2, etc. car c'est un champ de caractères.
.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>
Ici, nous avons ajouté un champ Char product_tags. Il s'agit d'un champ calculé auquel le nom de l'étiquette est concaténé.
Vous pouvez voir que nous avons fourni un filtre de regroupement appelé tag dans le fichier XML. Lorsque nous essayons de regrouper ces commandes client, elles apparaîtront ci-dessous.
De même, nous pouvons ajouter groupby pour many2many champs.
Voyons ensuite comment ajouter un filtre pour le champ many2many.
Vous pouvez créer un autre champ Many2Many pour calculer la valeur du champ many2many. Je vais fournir un exemple pour démontrer cela. Ce champ doit spécifier 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)]"/>
Vous pouvez fournir le nom de domaine si nécessaire car il peut être facilement recherché dans les champs enregistrés. Vous pouvez inclure le XPath de l'emplacement si vous le souhaitez.
Pour en savoir plus sur la création de champs plusieurs-à-plusieurs dans les formulaires du portail client dans Odoo 16