技術共有

Odoo 16のMany2ManyフィールドでGroup byを使用する方法

2024-07-12

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

Many2many フィールドは、モデル間の新しい関係を確立するという点で Many2one フィールドに似ています。存在するオドゥ16では、many2many レコードを使用して任意のレコードを選択できるため、many2many フィールドでグループ化することはできません。 many2many フィールドを使用してフィルターでグループを指定すると、アサーション エラーが発生します。

Odoo 16 で Many2Many フィールド グループを使用する方法の紹介。 

ここでは、既存の tag_ids many2many フィールドを使用します。次のコードに示すように:

.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>

Many2many フィールドを group_by フィルタリングに使用できます。これはフィールドをカウントする場合には機能しますが、many2many フィールドの値が 2 の場合、文字フィールドであるため、tag1、tag2 などのようにカンマ (,) で表示されます。

.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>

ここでは、Char フィールド product_tags を追加しました。これは、ラベル名が連結される計算フィールドです。

XML ファイル内に tag と呼ばれるグループ化フィルターが提供されていることがわかります。これらの販売注文ごとにグループ化しようとすると、以下のように表示されます。

同様に、many2many フィールドに groupby を追加できます。

次に、many2many フィールドにフィルターを追加する方法を確認してみましょう。

代替の Many2Many フィールドを作成して、Many2Many フィールドから値を計算できます。これを示す例を示します。このフィールドには、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)]"/>

保存されたフィールドで簡単に検索できるため、必要に応じてドメイン名を指定できます。必要に応じて、場所の xpath を含めることができます。

Odoo 16 のカスタマー ポータル フォームで多対多のフィールドを作成する方法について詳しく知りたい場合