0

我添加了一个新模型(称为 crm_lead_external),它通过 crm_lead 上的新 one2many 链接。

因此,我的模块定义了两个模型:一个更新的 crm_lead(使用 _name=crm_lead)和一个新的 crm_lead_external。

此外部模型跟踪文件,因此具有“文件名”字段。

我还在这个文件名字段上创建了一个唯一的 SQL 索引。

这是我的模块的一部分:

def copy(self, cr, uid, id, default=None, context=None):
    if not default:
        default = {}
    default.update({
        'state': 'new',
        'filename': '',
    })
    ret = super(crm_lead_external, self).copy(cr, uid, id, default, context=context)
    #do file copy
    return ret

此处的目的是允许复制外部实体,但重新定位文件路径。

现在,如果我单击 Lead 上的重复项,我会在我的唯一约束上得到一个 IntegrityError。没有调用 copy() 是否有特殊原因?

我应该将此逻辑添加到 copy_data() 吗?Myst 我真的为领先者覆盖了 copy() 吗?

提前致谢。

4

3 回答 3

3

有两个osv类方法:copycopy_data,所有子类都可以访问它们osv,例如您的crm_lead_external类。

当您单击复制时,它会调用osv.copy(). 如果您的模型包含任何关系字段并且这些字段具有链接的任何记录,那么osv将调用copy_data()链接的记录。在您的情况下,当您调用copymodel时crm.lead,它会调用copy_data()on crm_lead_external。您对 UNIQUE 有一个约束crm_lead_external,这会导致您的错误消息。

这个问题可以有两个修复。

  1. 如果您不想复制crm_lead_external记录,则覆盖模型的copy方法crm.lead并禁用复制crm_lead_externaloem 字段值。

    def copy(self, cr, uid, id, default=None, context=None):
        if default is None:
            default = {}
        default['o2m_field'] = []
        return super(<calss_name>, self).copy(cr, uid, id, default, context)
    

    这将停止复制 o2m 字段记录。

  2. 我们将覆盖copy您模型的方法,crm_lead_extenal因此每次copy_data调用时,我们都会解决 UNIQUE 约束并传递新值,这样您就不会遇到任何问题。

    def copy_data(self, cr, uid, id, default=None, context=None):
        if default is None:
            default = {}
        default['name'] = self.browse(cr, uid, id, context=context).name or ''
        if not context.get('copy',False):
            new_name = _("%s (copy)")%default.get('name','')
            default.update({'name':new_name})
        return super(<calss_bame>, self).copy_data(cr, uid, id, default, context)
    

    在此示例中,我在名称末尾附加了复制文本,因此我将始终获得一个新名称,同样您可以避免这样的 UNIQUE 约束,并且您将完美复制所有数据。

于 2012-06-26T05:23:04.587 回答
0

只需更改复制方法中唯一字段的值。就像在原始值之后添加“COPY”一样。

您可以在 addons/product/product.py 第 660 行中有示例

于 2012-06-26T09:13:39.487 回答
0

试试这个代码:

def copy(self,cr,uid,id,default = None,context = None):
        print"---------Calling copy function----"
        print default

                return super(demo_courses, self).copy(cr, uid, id, default, context)
于 2014-09-09T13:39:38.293 回答