Condivisione della tecnologia

Come utilizzare Raggruppa per il campo Many2Many in Odoo 16

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I campi Many2many sono simili ai campi Many2one in quanto stabiliscono nuove relazioni tra i modelli.esistereOddio 16 , non è possibile raggruppare i campi many2many perché qualsiasi record può essere selezionato utilizzando many2many record. Quando fornisci il gruppo per filtro utilizzando il campo many2many, riceverai un errore di asserzione.

Presentazione di come utilizzare il gruppo di campi Many2Many in Odoo 16。 

Qui utilizzerò il campo tag_ids many2many esistente. Come mostrato nel seguente codice:

.py

tag_ids = fields.Many2many('crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id', string='Tags')

.xml

  1. <record id="view_sales_order_filter" model="ir.ui.view">
  2. <field name="name">sale.order.view.list.inherit.module.name</field>
  3. <field name="model">sale.order</field>
  4. <field name="inherit_id" ref="sale.view_sales_order_filter"/>
  5. <field name="arch" type="xml">
  6. <xpath expr="//search/group/filter[@name='customer']" position="after">
  7. <separator/>
  8. <filter name="tag_ids" string="Tags" domain="[]" context="{'group_by': 'tag_ids'}"/>
  9. <separator/>
  10. </xpath>
  11. </field>
  12. </record>

È possibile utilizzare il campo Many2many per filtrare group_by. Funziona se contiamo i campi, ma se il valore nel campo many2many è 2, verrà visualizzato con una virgola (,) come tag1, tag2, ecc. perché è un campo di caratteri.

.py

  1. product_tags = fields.Char(string='Tags', compute='_get_tags', store=True)
  2. @api.model
  3. @api.depends('tag_ids')
  4. def _get_tags(self):
  5. for rec in self:
  6. if rec.tag_ids:
  7. product_tags = ','.join([p.name for p in rec.tag_ids])
  8. else:
  9. product_tags = ''
  10. rec.product_tags = product_tags

.xml

  1. <record id="view_sales_order_filter" model="ir.ui.view">
  2. <field name="name">sale.order.view.list.inherit.module.name</field>
  3. <field name="model">sale.order</field>
  4. <field name="inherit_id" ref="sale.view_sales_order_filter"/>
  5. <field name="arch" type="xml">
  6. <xpath expr="//search/group/filter[@name='customer']"
  7. position="after">
  8. <separator/>
  9. <filter name="tag_ids" string="Tags" domain="[]"
  10. context="{'group_by': 'product_tags'}"/>
  11. <separator/>
  12. </xpath>
  13. </field>
  14. </record>
  1. <record id="sale_view_form_custom" model="ir.ui.view">
  2. <field name="name">ale.order.view.form.inherit.module.name</field>
  3. <field name="model">sale.order</field>
  4. <field name="inherit_id" ref="sale.view_order_form"/>
  5. <field name="arch" type="xml">
  6. <xpath expr="//field[@name='payment_term_id']" position="after">
  7. <field name="product_tags"/>
  8. </xpath>
  9. </field>
  10. </record>

Qui abbiamo aggiunto un campo Char product_tags. È un campo calcolato a cui è concatenato il nome dell'etichetta.

Puoi vedere che abbiamo fornito un filtro di raggruppamento chiamato tag nel file XML. Quando proviamo a raggruppare questi ordini di vendita, verranno visualizzati di seguito.

Allo stesso modo, possiamo aggiungere groupby per molti2molti campi.

Successivamente, controlliamo come aggiungere un filtro per il campo many2many.

È possibile creare un campo Many2Many alternativo per calcolare il valore dal campo many2many. Fornirò un esempio per dimostrarlo. Questo campo deve specificare store=True.

.py

  1. newfield_id = fields.Many2one('example_ids', compute=_compute_newfield_id, store=True)
  2. @api.depends('example_ids')
  3. def _compute_newfield_id(self):
  4. for record in self:
  5. 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)]"/>

Puoi fornire il nome del dominio se richiesto in quanto può essere facilmente ricercato nei campi salvati. Se lo desideri, puoi includere l'Xpath della posizione.

Per saperne di più sulla creazione di campi molti-a-molti nei moduli del portale clienti in Odoo 16