Model OpenERP模型跟踪外部资源,与父级挂钩';s copy()或copy_data()
我添加了一个新的模型(称为crm_lead_external),它通过crm_lead上的一个新的one2many链接 因此,我的模块定义了两个模型:更新的crm_lead(使用_name=crm_lead)和新的crm_lead_external 这个外部模型跟踪一个文件,因此有一个“filename”字段 我还在这个文件名字段上创建了一个唯一的SQL索引 这是我的模块的一部分: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):
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()
。在您的情况下,当您在modelcrm.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()
。在您的情况下,当您在modelcrm.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(清除默认值),然后手动自定义复制对象。请添加几行解释为什么您认为您的解决方案是对原始问题的一个好答案,谢谢。请添加几行解释为什么您认为您的解决方案是原始问题的好答案,谢谢。