Odoo14自定义向导开发报错:'str' object has no attribute 'get'及数据同步需求咨询
解决Odoo 14自定义向导的AttributeError及数据同步问题
一、先解决AttributeError: 'str' object has no attribute 'get'错误
从你的错误日志和代码来看,这个错误的核心是Odoo处理字段ondelete属性时,遇到了字符串类型的值,但代码逻辑期望它是字典结构。下面是具体的排查和修复步骤:
1. 确认依赖模型存在
你的向导里用了std.record和std.subject两个关联模型,请先检查:
- 这两个模型已经在你的模块或依赖模块中正确定义
- 包含这两个模型的模块已经成功安装到Odoo中
如果模型不存在,Odoo加载字段定义时会触发异常,间接导致ondelete属性处理出错。
2. 清理错误的ondelete配置
- Python代码检查:检查所有字段定义(当前模块+依赖模块)的
ondelete参数,确保格式正确。Odoo中Many2one字段的ondelete应该是字符串值(比如'cascade'、'set null'),不要写成字典或其他类型。 - XML视图检查:查看你的XML视图里有没有字段标签额外加了
ondelete属性(比如<field name="std_wiz" ondelete="cascade"/>),这类属性应该在Python字段定义里设置,XML里直接删掉即可。
3. 数据库层面修复(旧版本升级场景)
如果你的数据库是从Odoo旧版本(比如日志里显示的Odoo 11)升级来的,可能存在ir_model_field表中ondelete字段格式错误的情况:
- 进入数据库,查询
ir_model_field表中ondelete为字符串的记录 - 确认这些值是合法的Odoo ondelete参数(比如
'cascade'),如果有非法值,修改为合法格式后重新加载模块
4. 检查菜单配置
你XML里定义的菜单项parent="school_root_menu",请确认这个父菜单ID确实存在,否则可能引发模块加载的连锁异常。
二、实现向导数据同步到其他字段的功能
假设你想把向导里的学生、科目、分数同步到独立的成绩模型,或者直接更新学生模型的字段,下面是具体实现:
1. 先定义目标成绩模型(如果还没有)
from odoo import fields, models class StdExamResult(models.Model): _name = 'std.exam.result' _description = 'Student Exam Result' student_id = fields.Many2one('std.record', string='Student', required=True) subject_id = fields.Many2one('std.subject', string='Subject', required=True) marks = fields.Float(string='Marks', required=True)
2. 修改向导的save_btn方法实现同步
更新你的CreateExam类中的save_btn方法,添加同步逻辑:
def save_btn(self): # 1. 同步到独立的成绩模型,创建新的成绩记录 self.env['std.exam.result'].create({ 'student_id': self.std_wiz.id, 'subject_id': self.std_subject.id, 'marks': self.std_marks, }) # 2. 同步更新学生模型的字段(比如累加总分,假设std.record有total_marks字段) if self.std_wiz: self.std_wiz.write({ 'total_marks': (self.std_wiz.total_marks or 0) + self.std_marks }) # 关闭向导并刷新视图,让用户看到同步后的结果 return { 'type': 'ir.actions.client', 'tag': 'reload', }
3. 可选:同步到学生模型的One2many字段
如果std.record模型有一个关联成绩的One2many字段:
# 在std.record模型中添加 exam_results = fields.One2many('std.exam.result', 'student_id', string='Exam Results')
那上面的create操作会自动关联到学生的exam_results字段,不需要额外操作。
内容的提问来源于stack exchange,提问作者alfik
相关产品推荐
相关产品推荐

