Openerp 预期单亲奥多9

Openerp 预期单亲奥多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,

在树状视图中输入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, "%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()