Openerp 预期单亲奥多9
在树状视图中输入2行或更多新行,然后单击save get errorOpenerp 预期单亲奥多9,openerp,odoo-9,odoo-10,Openerp,Odoo 9,Odoo 10,在树状视图中输入2行或更多新行,然后单击save get error raise ValueError("Expected singleton: %s" % self) ValueError: Expected singleton: my.model(2116, 2117) 我的源代码: @api.depends('start', 'finish','stop') def total_fun(self): time1 = datetime.strptime(self.start,
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: my.model(2116, 2117)
我的源代码:
@api.depends('start', 'finish','stop')
def total_fun(self):
time1 = datetime.strptime(self.start, "%Y-%m-%d %H:%M:%S")
time2 = datetime.strptime(self.finish, "%Y-%m-%d %H:%M:%S")
self.total = round(((time2 - time1).seconds / float(60*60) - self.stop))
错误消息显示->
预期的单例数
这意味着:您使用的是记录集而不是记录
解决这个问题
for rec in self:
在函数的开头,然后使用
rec
而不是self
,正如您在错误消息Expected singleton:my.model(21162117)
默认情况下,在odoo中,self始终是一个记录集(意味着它可以包含多个记录)。因此,当您执行self.getSomeField
时,这里的odoo将混淆您要从哪个记录中获取值
如果您不告诉odoo,确保在访问属性时self始终包含一条记录,如果记录集包含多条记录,则会引发此错误
现在,如何告诉odoo确保总是有一条记录是通过向方法添加@api.one
decorator。但不建议这样做,因为在您的例子中,odoo有两条记录,所以他将循环并调用每个记录的方法,并传递一个只有该记录的记录集。假设您执行搜索或与数据库的任何通信
所以,只有当您确定自己在做什么时,才不要使用@api.one
,因为您可以进行10000个方法调用并与数据库交互
如使用@api.one
的示例所示:
# every call to this method you will execute a search.
self.env['some.model'].search([('m2o_id' , '=', self.id)]
您可以在循环之前执行此操作:
# one query for all record with one call to the method
result = self.env['some.model'].search([('m2o_id' , 'in', self.ids)]
for rec in self:
# use result here
# or here ..
Tnx,也在@api.dependens之前,我是add@api.one如果您添加了
@api.one
,那么您就不再需要for循环,因为odoo将在整个记录集中自行循环。因此,self
将始终是一个单例。@CZoellner在我的示例中,没有api是无法工作的。一个添加了@api的源代码示例。一个
应该可以毫无问题地运行。我希望它将来会对您有所帮助。作为一个小提示:使用Odoo的fields.Date
和fields.Datetime
函数来转换日期/日期时间。有from_string()
和to_string()
。