如何从Odoo数据库中提取属性字段(如property_payment_term_id)
如何提取Odoo中属性字段(如property_payment_term_id)的值?
经常折腾Odoo数据库的朋友可能会碰到这个情况:查看res_partner这类业务表时,像property_payment_term_id这类字段根本没直接显示在表里。其实这些是属性字段,它们的实际数据都存在ir_property这个专门的属性表中。下面分享两种实用的提取方法:
方法一:用Odoo ORM查询(最推荐)
Odoo的ORM已经帮我们封装好了属性字段的查询逻辑,直接调用模型字段就能拿到值,完全不用自己手动关联表。比如以res.partner模型为例:
# 假设你已经获取了Odoo的环境对象env partner = env['res.partner'].browse(目标合作伙伴ID) # 直接访问属性字段即可获取对应记录 payment_term = partner.property_payment_term_id # 如果需要单独拿ID或名称 payment_term_id = partner.property_payment_term_id.id payment_term_name = partner.property_payment_term_id.name
ORM会自动帮你匹配当前用户、所属公司、对应模型和字段的属性值,连默认值的情况都能处理得妥妥的,非常省心。
方法二:直接写SQL查询
如果需要直接操作数据库,就得手动关联业务表和ir_property表,关键要匹配几个核心条件:
- ir_property的
res_id格式是模型名,记录ID,要和业务表的ID对应(比如res_partner的ID对应res.partner,{partner_id}) name字段要等于目标属性字段名,比如'property_payment_term_id'- 多公司架构下,一定要加上
company_id的匹配条件,避免拿到其他公司的属性值
示例SQL语句:
SELECT rp.id AS partner_id, rp.name AS partner_name, ip.value_reference AS payment_term_ref, pt.name AS payment_term_name FROM res_partner rp LEFT JOIN ir_property ip ON ip.res_id = CONCAT('res.partner,', rp.id) AND ip.name = 'property_payment_term_id' -- 多公司环境下打开下面的注释,替换成你的公司ID -- AND ip.company_id = 1 LEFT JOIN account_payment_term pt ON pt.id = SPLIT_PART(ip.value_reference, ',', 2)::integer WHERE rp.id = 目标合作伙伴ID;
这里要注意:ir_property的value_reference存储的是类似account.payment_term,1的字符串,所以需要用SPLIT_PART拆分出ID,再关联对应的目标表(比如这里的account_payment_term)才能拿到具体的名称等信息。
额外提醒
- 如果某个记录没有单独设置属性值,会使用模型的默认值,ORM查询会自动处理这种情况,但SQL查询需要额外编写逻辑去获取默认值。
- 多公司场景下,company_id的匹配一定要注意,否则很容易拿到错误的属性数据。
内容的提问来源于stack exchange,提问作者Hydronit
相关产品推荐
相关产品推荐

