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

Odoo V8中ir.rule关联字段仅对新记录生效,如何适配旧记录?

解决旧account.voucher记录user_id字段未存储值的问题

先修正字段定义的问题

你当前的user_id字段定义存在逻辑问题:message_follower_ids是多对多字段,直接关联它的name会返回名称列表,存入Char字段会导致数据格式异常,且无法和权限规则中的user.id(整数类型)正确匹配。建议调整为关联res.users的字段,示例如下:

class AccountVoucher(models.Model):
    _inherit = 'account.voucher'

    user_id = fields.Many2one('res.users', string='Salesperson', compute='_compute_user_id', store=True)

    @api.depends('message_follower_ids')
    def _compute_user_id(self):
        for record in self:
            # 筛选关注者中关联了用户的记录,可根据实际业务调整取数逻辑
            user_follower = record.message_follower_ids.filtered(lambda f: f.partner_id.user_id)
            record.user_id = user_follower.partner_id.user_id[:1] if user_follower else False

批量更新旧记录的字段值

新增store=True的计算字段时,Odoo不会自动为旧记录计算存储值,需要手动触发更新,以下是两种可行方式:

方式一:编写数据迁移脚本

在模块的migrations目录下创建对应版本的迁移文件(比如migrations/1.0.1/update_voucher_user_id.py,版本号需匹配模块当前版本),内容如下:

from odoo import api, SUPERUSER_ID

def migrate(cr, version):
    if not version:
        return
    env = api.Environment(cr, SUPERUSER_ID, {})
    vouchers = env['account.voucher'].search([])
    for voucher in vouchers:
        # 逻辑需和字段的compute方法保持一致
        user_follower = voucher.message_follower_ids.filtered(lambda f: f.partner_id.user_id)
        voucher.user_id = user_follower.partner_id.user_id[:1] if user_follower else False

升级模块后,Odoo会自动执行该脚本,批量更新所有旧记录的user_id值。

方式二:通过Odoo Shell手动执行

在服务器上运行Shell命令进入Odoo交互环境:

odoo-shell -d 你的数据库名 -u 你的模块名

进入后执行以下代码:

vouchers = env['account.voucher'].search([])
for voucher in vouchers:
    user_follower = voucher.message_follower_ids.filtered(lambda f: f.partner_id.user_id)
    voucher.user_id = user_follower.partner_id.user_id[:1] if user_follower else False

执行完成后退出Shell即可。

验证效果

更新完成后刷新页面,测试权限规则,旧记录应该能被对应用户正常查看。

内容的提问来源于stack exchange,提问作者odoo newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:20:19