首页 > 解决方案 > 我有一个 many2many 表,但我需要提供域,因为只有模型中的合作伙伴记录需要显示在 many2many 表中

问题描述

class HealthProfileInherit(models.Model):
    _inherit = 'health.profile'

    health_profile_health_test_id = fields.Many2many('health.test',
                                          string ='Laboratory Test')

这是连接两个表的字段,这里如何给域?我想写一个函数还是可以在字段内给出域?

标签: odoo

解决方案


以下域:

domain="[('partner_id', '=', partner_id)]"

单击add item按钮链接后,将过滤弹出列表中显示的记录。只有与配置文件合作伙伴的测试记录将可见。

字符串域应该是动态的,并且仅在客户端进行评估。

默认情况下,用户可以从弹出列表中创建记录,并且可以在partner_id字段中选择任何合作伙伴。

如果要从弹出列表中禁用创建选项,请使用以下no_create选项:

options="{'no_create': True}"  

如果您想保留创建按钮并强制用户选择配置文件合作伙伴,您可以为health.test模型创建一个新表单并将合作伙伴字段设置为不可见,然后在上下文中传递默认合作伙伴值并强制 many2many 字段使用该表单。

<field name="health_profile_health_test_id" 
       domain="[('partner_id', '=', partner_id)]"
       context="{'form_view_ref': 'module_name.health_test_form', 'default_partner_id': partner_id}"/>

请记住,优先级最低的表单视图将用作默认表单视图(默认优先级值为16):

例子:

<record id="health_test_form" model="ir.ui.view">
    <field name="name">health.test Form</field>
    <field name="model">health.test</field>
    <field name="priority" eval="20"/>
    <field name="arch" type="xml">
        <form>
            <group>
                <field name="partner_id" invisible="True"/>
                ....
            </group>
            ....
        </form>
    </field>
    </record>

编辑:

字符串域是动态的并在客户端进行评估,例如"[('partner_id', '=', partner_id)]"字符串域将被评估为[('partner_id', '=', 26)] ,如果列表已经选择了记录,则将使用 排除记录['!', ['id', 'in', list_of_ids]]

但是当将域作为具有 many2one 字段引用的列表传递时,该值将是 typeMany2one并且服务器应该RecursionError在尝试获取字段属性时引发 a(在 v12、v13 中测试)。

如果您查看 Odoo 源代码,您会发现许多使用列表域但具有简单值(如布尔值、字符串等)的示例。


推荐阅读