Model OpenERP模型跟踪外部资源,与父级挂钩';s copy()或copy_data()

Model OpenERP模型跟踪外部资源,与父级挂钩';s copy()或copy_data(),model,copy,openerp,Model,Copy,Openerp,我添加了一个新的模型(称为crm_lead_external),它通过crm_lead上的一个新的one2many链接 因此,我的模块定义了两个模型:更新的crm_lead(使用_name=crm_lead)和新的crm_lead_external 这个外部模型跟踪一个文件,因此有一个“filename”字段 我还在这个文件名字段上创建了一个唯一的SQL索引 这是我的模块的一部分: def copy(self, cr, uid, id, default=None, context=None):

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

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

这个外部模型跟踪一个文件,因此有一个“filename”字段

我还在这个文件名字段上创建了一个唯一的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上的duplicate,我会在唯一约束上得到IntegrityError。没有调用copy()有什么特别的原因吗

我是否应该将此逻辑添加到复制_data()中?Myst我真的为lead覆盖了copy()

提前感谢。

有两个:
copy
copy\u data
,可供所有
osv
子类访问,例如您的
crm\u lead\u external

单击“复制”时,它将调用
osv.copy()
。如果您的模型包含任何关系字段,并且这些字段有任何链接的记录,则
osv
将对链接的记录调用
copy_data()
。在您的情况下,当您在model
crm.lead
上调用
copy
时,它会在
crm\u lead\u external
上调用
copy\u data()
。您在
crm\u lead\u external
上有一个唯一的约束,这会导致错误消息

这个问题有两种解决方法

  • 如果不想复制
    crm\u lead\u external
    记录,请覆盖
    crm.lead
    模型的
    copy
    方法,并禁用复制
    crm\u lead\u external
    oem字段值

    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)
    
    在本例中,我在名称的末尾添加了复制文本,因此我将始终获得一个新名称,同样,您可以避免像这样的唯一约束,并且可以完美地复制所有数据

  • 有两个:
    copy
    copy\u data
    ,可供所有
    osv
    子类访问,例如
    crm\u lead\u external

    单击“复制”时,它将调用
    osv.copy()
    。如果您的模型包含任何关系字段,并且这些字段有任何链接的记录,则
    osv
    将对链接的记录调用
    copy_data()
    。在您的情况下,当您在model
    crm.lead
    上调用
    copy
    时,它会在
    crm\u lead\u external
    上调用
    copy\u data()
    。您在
    crm\u lead\u external
    上有一个唯一的约束,这会导致错误消息

    这个问题有两种解决方法

  • 如果不想复制
    crm\u lead\u external
    记录,请覆盖
    crm.lead
    模型的
    copy
    方法,并禁用复制
    crm\u lead\u external
    oem字段值

    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)
    
    在本例中,我在名称的末尾添加了复制文本,因此我将始终获得一个新名称,同样,您可以避免像这样的唯一约束,并且可以完美地复制所有数据


  • 只需更改复制方法中唯一字段的值。比如在原值后面加上“COPY”


    您可以在addons/product/product.py第660行中使用en示例,只需更改copy方法中唯一字段的值即可。比如在原值后面加上“COPY”

    您可以在addons/product/product.py第660行的en示例中尝试以下代码:

    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)
    
    请尝试以下代码:

    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)
    

    所以,是的,我的选项要么覆盖父(crm.lead)copy(),要么覆盖子(crm.lead.external)copy_data()。德拉特。好的,谢谢你提供的信息。我不会重写copy_data(),因为我还不知道在哪里复制外部资源,所以我可能会执行方法1(清除默认值),然后手动自定义对象的副本。因此,是的,我的选项是重写父(crm.lead)copy()或重写子(crm.lead.external)copy_data()。德拉特。好的,谢谢你提供的信息。我不会重写copy_data(),因为我还不知道将外部资源复制到哪里,所以我可能会执行方法1(清除默认值),然后手动自定义复制对象。请添加几行解释为什么您认为您的解决方案是对原始问题的一个好答案,谢谢。请添加几行解释为什么您认为您的解决方案是原始问题的好答案,谢谢。