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
我正在尝试在发生阶段更改时创建一个 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