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
相关产品推荐
相关产品推荐

