2017-12-02 165 views
2

我有一个形式的按钮,单击时应该更新从spray.action模型数据当前模型mrl。然后,我做进一步的处理,但它引发错误为什么我得到这个错误?:预计单:spray.action(1,2)

ValueError("Expected singleton: %s" % self) ValueError: Expected singleton: spray.action(1, 2) 
@api.multi 
def mrlCreateSprayRecords(self): 
    spray_ids = [] 
    vals = [] 
    spray_obj = self.env['spray.action'].search([]) 
    print("spray_obj \n\n\n\t %s ", spray_obj) 
    for obj in spray_obj: 
     print("Spray Action Objects \n\n %s \n\t ", obj) 
     vals = { 
      'ref': obj.ref, 
      'farm': obj.farm.farm, 
      'block': obj.block.block, 
      'valves': obj.valves.valve, 
     } 
     print("Spray Action Data Browse , \n\n\t %s ", vals) 
     res = super(Mrl, self).create(vals) 
     res.update(vals) 
     print("object in mrlCreateSprayRecords \n\n\t %s", res) 
    return { 
     'name': 'Update Mrl Operations', 
     'type': 'ir.actions.act_window', 
     'view_type': 'form', 
     'view_mode': 'form', 
     'res_model': 'mrl', 
     'views': [(spray_obj.id, 'form')], 
     'view_id': spray_obj.id, 
     # 'target': 'new', 
     'res_id': self.id, 
     'context': self.env.context, 

    } 
+0

下一次试着问用更少的噪音,以帮助读者解答,请:P – ChesuCR

+0

只需在搜索中添加上限= 1,如。 spray_obj = self.env ['spray.action']。search([],limit = 1) –

回答

4

我想你'view_id': spray_obj.id,必须有写视图id的行中得到的错误。 spray_obj记录集有很多记录,所以你不能像那样使用它(spray_obj.id)。您也可以删除view_id参数以便使用默认视图。

@api.multi 
def mrlCreateSprayRecords(self): 
    self.ensure_one() 

    spray_obj = self.env['spray.action'].search([])  # recordset of all records of the model???? 
    for obj in spray_obj: 
     vals = { 
      'ref': obj.ref, 
      'farm': obj.farm.farm, 
      'block': obj.block.block, 
      'valves': obj.valves.valve, 
     } 
     self.create(vals) 

    view_id = self.env.ref('module.xml_view_id').id   

    return { 
     'name': 'Update Mrl Operations', 
     'type': 'ir.actions.act_window', 
     'view_type': 'form', 
     'view_mode': 'form', 
     'res_model': 'mrl', 
     'view_id': view_id, 
     'res_id': self.id, 
     'context': self.env.context, 
    } 

我已经加入self.ensure_one(),因为res_id必须只有一个ID为好。

我删除res.update(vals)线,因为它没有任何意义,我哈哈

更多的事情

而是打印的,你应该使用记录器:

import logging 
_logger = logging.getLogger(__name__) 

_logger.info('Hello') 

相反,行res = super(Mrl, self).create(vals)我认为你应该使用这一个

res = self.create(vals)  # if you are in the mrl model 
2

总之,当您访问包含多条记录的recordSet的字段direclty时,会出现此类错误。

您对搜索returnd 2记录spray.action执行搜索(1, 2)

所以,当你做spray_obj.id odoo会感到困惑什么ID,他应该返回1或2,而这里odoo抛出这个错误。

所以不要访问一个字段的搜索结果,或x2many fiels他们可能有多个记录里面。

@ChesuCR有所改善你的代码并纠正它