You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:34:23