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

Unique constraints cause error when duplicating record in Odoo 11

我的 code 字段有唯一约束。当我在下拉操作中单击 'duplicate' 选项时,出现验证错误。 有什么方法可以使用 'duplicate' 即使字段 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 !')
    ]

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

方式一:修改code字段的copy参数

这种方式是最简单的方式,但如果 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 !')
    ]

方式二:修改模型的copy方法sample

如果必须 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