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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:17:48