Odoo TypeError: 'NewId' object is not iterable

Odoo TypeError: 'NewId' object is not iterable

我正在尝试在发生阶段更改时创建一个 activity,但不断得到 TypeError: 'NewId' object is not iterable。 我发现 @onchange 创建了一个替换 self 的新对象,我猜这是错误原因。

这是我的代码:

class ProjectSetAndDateType(models.Model):
    _inherit = 'project.task.type'

    last_stage = fields.Boolean(string="Fertigstellungsstufe")


class ProjectSetEndDate(models.Model):
    _inherit = 'project.task'

    @api.onchange('stage_id')
    def _set_end_date(self):
        if self.stage_id.last_stage:
            self.kanban_state = "done"
            self.date_finished = datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')

            activity_deadline = datetime.now() + timedelta(days=30)

            data = {
                'res_id':  self._origin.id,
                'res_model': 'project.task',
                'res_model_id': self.env['ir.model'].search([('model', '=', 'project.task')]).id,
                'user_id': self._origin.project_id.user_id.id,
                'summary': 'Aufgabe archivieren nach Fertigstellung',
                'activity_type_id': self.env.ref('project_set_end_date.mail_set_end_date_archive').id,
                'date_deadline': activity_deadline
                }
            self.env['mail.activity'].create(data)

'NewId' 对象是一个记录集,当您创建任何新记录时,odoo 会将其存储在 newid class 中,而不是数据库中,并且您正在尝试编写 kanban_state, date_finished 在尚未创建的记录中。 我建议你改变逻辑并在 write 或 create 方法上重写这段代码,

注意:请确保不要在 onchange 方法上创建任何记录,因为它非常危险且不友好。

我把它重写成这个,现在它按预期工作了。

from odoo import models, fields, api
from datetime import timedelta
from datetime import datetime


class ProjectSetAndDateType(models.Model):
    _inherit = 'project.task.type'

    last_stage = fields.Boolean(string="Fertigstellungsstufe")


class ProjectSetEndDate(models.Model):
    _inherit = 'project.task'

    @api.multi
    def write(self, vals):
        if 'stage_id' in vals:
            final_stage = self.env['project.task.type'].search([('id', '=', vals['stage_id'])]).last_stage
            if final_stage:
                vals['kanban_state'] = "done"
                vals['date_finished'] = datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')

                activity_deadline = datetime.now() + timedelta(days=40)

                data = {
                    'res_id':  self.id,
                    'res_model': 'project.task',
                    'res_model_id': self.env['ir.model'].search([('model', '=', 'project.task')]).id,
                    'user_id': self.project_id.user_id.id,
                    'summary': 'Aufgabe archivieren nach Fertigstellung',
                    'activity_type_id': self.env.ref('project_set_end_date.mail_set_end_date_archive').id,
                    'date_deadline': activity_deadline
                    }
                self.env['mail.activity'].create(data)

        res = super().write(vals)
        return res