odoo - 我有一个 many2many 表,但我需要提供域,因为只有模型中的合作伙伴记录需要显示在 many2many 表中
问题描述
class HealthProfileInherit(models.Model):
_inherit = 'health.profile'
health_profile_health_test_id = fields.Many2many('health.test',
string ='Laboratory Test')
这是连接两个表的字段,这里如何给域?我想写一个函数还是可以在字段内给出域?
解决方案
以下域:
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 源代码,您会发现许多使用列表域但具有简单值(如布尔值、字符串等)的示例。
推荐阅读
- flutter - 如何使用主密码解锁 Flutter 上的 Hive secureBox
- sharepoint - MS Teams - 任务模块未打开 SharePoint URL
- swift - Swift 继承的协议作为 inout 发送到函数
- python - Rosenbrock 函数的微分演化方法
- go - 如何将时区设置为现有时间戳而不重新解释它?
- python - python中变量的标识什么时候改变?
- azure - Azure 认知搜索中的符合分数
- google-cloud-platform - 尽管启用了 VPC 规则,但我无法在 Google VM 实例中打开端口
- arrays - 方法修改数组
- docker - K8s 环境 - 从 Pod 卷曲一个端点(指向外部数据库)失败并超时