【问题标题】:Unique constraints cause error when duplicating record in Odoo 11在 Odoo 11 中复制记录时,唯一约束会导致错误
【发布时间】:2018-09-14 03:45:07
【问题描述】:

我的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 !')
    ]

【问题讨论】:

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


    【解决方案1】:

    是的,是的。你有两种方法可以做到这一点。当你复制一条记录时,copy 方法被调用,它使用原始记录的值创建一个新记录(它只复制参数 copy=True 的字段的值 - 默认为 True em>-)。因此,您可以在 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
    

    【讨论】:

    • 当我使用方式 2 时遇到此错误 @api.returns('self', lambda value: value.id) AttributeError: 'list' object has no attribute 'id'
    • 我尝试了方式 1 错误:“代码”列中的空值违反了非空约束细节:失败行包含 (42, null, Cold ,1, 2018-04-06 05:07: 34.181, 1, 2018-04-06 05:07:34.181)
    • @VarshaBolli Way 1 中的错误是有道理的,因为当你复制记录时,code 不会复制到新记录中,它仍然为空,并且作为这是必需的,它会给你一个错误。如果不需要code 就可以了,我会在答案中指定,但 Way 2 肯定有效。
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2015-12-17
    • 2018-11-24
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多