0

crm_leadの新しいone2manyを介してリンクされる新しいモデル(crm_lead_externalと呼びます)を追加しました。

したがって、私のモジュールには2つのモデルが定義されています。更新された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

ここでの目的は、外部エンティティの複製を許可することですが、ファイルパスを再ターゲットすることです。

ここで、リードで[複製]をクリックすると、一意の制約でIntegrityErrorが発生します。copy()が呼び出されない特別な理由はありますか?

このロジックをcopy_data()に追加する必要がありますか?ミスト私は本当にリードのcopy()をオーバーライドしますか?

前もって感謝します。

4

3 に答える 3

3

2つのosvクラスメソッドがあります:copyと、これらは、クラスなどのcopy_dataすべてのサブクラスにアクセスできます。osvcrm_lead_external

[複製]をクリックすると、が呼び出されますosv.copy()。モデルにリレーショナルフィールドが含まれていて、それらのフィールドにレコードがリンクされている場合は、リンクされたレコードosvを呼び出しcopy_data()ます。あなたの場合、copyモデルを呼び出すとcrm.lead、が呼び出さcopy_data()crm_lead_externalます。にUNIQUE制約がcrm_lead_externalあり、それがエラーメッセージの原因になります。

この問題には2つの修正があります。

  1. crm_lead_externalレコードをコピーしたくない場合は、モデルのcopyメソッドをオーバーライドし、 OEMフィールド値のコピーを無効にします。crm.leadcrm_lead_external

    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メソッドの一意のフィールドの値を変更するだけです。元の値の後に「COPY」を追加するようなものです。

addons / product / product.py lineno660に例を含めることができます

于 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 に答える