预期的单身人士9

时间:2017-07-05 12:42:08

标签: openerp odoo-9 odoo-10

在树状视图中输入2个或更多新行并单击“保存获取错误”

  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))

2 个答案:

答案 0 :(得分:4)

错误消息说 - > expected singleton这意味着:您正在使用记录集而不是记录。

要解决此问题

for rec in self:

在函数开头,然后使用rec代替self

答案 1 :(得分:1)

正如您在错误消息Expected singleton: my.model(2116, 2117)

中看到的那样

默认情况下,在selfoo中,self始终是一个记录集(意味着它可以包含多个记录。)所以当你self.getSomeField执行@api.one时,odoo将会混淆你希望从中获取值的记录。

如果你没有告诉odoo确保当你访问一个属性时,如果recordSet包含多个记录,那么self将始终包含一条记录,则会引发此错误。

现在如何告诉odoo确保总有一条记录是通过向方法添加@api.one装饰器。但不建议使用,因为odoo在你的情况下有两个记录,所以他将循环并调用每个记录的方法并传递一个只有该记录的记录集。想象一下你执行搜索或与数据库的任何通信。

因此,只有在确定自己正在做什么时才使用@api.one,因为您可以进行10000方法调用并与数据库进行交互。

就像使用 # 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 ..

你可以在循环之前做到这一点:

{{1}}