在Odoo 11中复制记录时,唯一约束会导致错误

时间:2018-04-04 14:15:55

标签: python-3.x odoo odoo-11

我的code字段有一个唯一约束。当我点击'复制'下拉操作中的选项我收到验证错误。 有没有办法使用'复制'即使字段code是唯一的?

 class sample(models.Model):
    _name = 'sample'

    code=fields.Char('Code',required=True)
    name=fields.Char('Name',required=True)

    _sql_constraints = [
        ('code_uniq', 'unique (code)', 'The code must be unique !')
    ]

1 个答案:

答案 0 :(得分:2)

是的,确实如此。你有两种方法可以做到这一点。复制记录时,会调用copy方法,并使用原始记录的值创建新记录(它只复制参数copy=True的字段值 - 默认为 - )。因此,您可以在code字段声明中更改该参数,或修改copy方法以避免相同的复制。

方式1:修改代码字段的副本参数

这种方式最简单,但如果需要code字段,则会出错。

class sample(models.Model):
    _name = 'sample'

    code = fields.Char('Code', required=False, copy=False)
    name = fields.Char('Name', required=True)

    _sql_constraints = [
        ('code_uniq', 'unique (code)', 'The code must be unique !')
    ]

方式2:修改模型的副本方法示例

如果必须code,这就是您要找的方式。

class sample(models.Model):
    _name = 'sample'

    code = fields.Char('Code', required=True)
    name = fields.Char('Name', required=True)

    _sql_constraints = [
        ('code_uniq', 'unique (code)', 'The code must be unique !')
    ]

    @api.one
    def copy(self, default=None):
        if default is None:
            default = {}
        new_code = (self.code + ' (copy)') if self.code else ''
        default.update({
            'code': new_code,
        })
        new_sample = super(sample, self).copy(default=default)
        return new_sample