моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Поля Many2many аналогичны полям Many2one тем, что они устанавливают новые отношения между моделями.существоватьОду 16 , вы не можете группировать по полям «много2много», поскольку любую запись можно выбрать с помощью записей «много2много». Когда вы задаете группу по фильтру, используя поле Many2Many, вы получите ошибку утверждения.
Представляем, как использовать группу полей Many2Many в Odoo 16。
Здесь я буду использовать существующее поле tag_ids Many2Many. Как показано в следующем коде:
.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>
Вы можете использовать поле Many2many для фильтрации по group_by. Это работает, если мы подсчитываем поля, но если значение в поле «many2many» равно 2, оно будет отображаться с запятой (,), как tag1, tag2 и т. д., поскольку это символьное поле.
.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>
Здесь мы добавили поле Product_tags Char. Это вычисляемое поле, к которому присоединяется имя метки.
Вы можете видеть, что мы предоставили группирующий фильтр под названием тег в XML-файле. Когда мы попытаемся сгруппировать эти заказы на продажу, они появятся ниже.
Аналогичным образом мы можем добавить группировку для полей «многие2многих».
Далее давайте проверим, как добавить фильтр для поля Many2Many.
Вы можете создать альтернативное поле Many2Many для вычисления значения из поля Many2Many. Я приведу пример, чтобы продемонстрировать это. В этом поле должно быть указано 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)]"/>
При необходимости вы можете указать доменное имя, поскольку его можно легко найти в сохраненных полях. Если хотите, вы можете указать xpath местоположения.
Чтобы узнать больше о создании полей «многие ко многим» в формах клиентского портала в Odoo 16.