【问题标题】:Why do I get this error?: Expected singleton: spray.action(1, 2)为什么会出现此错误?:预期单例:spray.action(1, 2)
【发布时间】:2018-05-16 15:37:27
【问题描述】:

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

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,

    }

【问题讨论】:

  • 下次尽量问声音小一点,帮助读者回答,请:P
  • 只需在搜索中添加limit=1,例如。 spray_obj = self.env['spray.action'].search([], limit=1)

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


【解决方案1】:

我认为您在'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】:

    简而言之,当您访问包含多个记录的记录集的字段直接时,您会遇到这种错误。

    您对 spray.action 执行了搜索,搜索返回了 2 条记录 (1, 2)

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 2021-03-29
      • 2022-01-04
      • 2018-12-06
      • 2016-03-29
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多