为什么我会收到这个错误?:预期的单身人士:spray.action(1,2)

时间:2017-12-02 19:50:18

标签: odoo-10 odoo-9 odoo odoo-view

我有一个表单中的按钮,单击时应该使用mrl模型中的数据更新当前模型spray.action。然后我做了进一步处理,但它引发了错误

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,

    }

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

您对搜索返回2记录(1, 2)

的spray.action进行了搜索

所以当你做spray_obj.id时,odoo将会混淆他应该返回1或2的id。这里odoo抛出这个错误。

所以不要在搜索结果中访问字段,或者在x2many fiels中访问它们可能有多个记录。

@ChesuCR改进了您的代码并对其进行了更正