4

既存のモデルにいくつかのフィールドを追加するモジュールを OpenERP に組み込みました。

定義はおおよそ次のとおりです。

class res_partner(osv.osv):
    _name = _inherit = 'res.partner'
    _columns = {
        'my_special_id': fields.integer('Special ID', required=False, readonly=True),
    }
    _defaults = {
        'my_special_id': lambda *a: None
    }

    _sql_constraints = [
        ('special_id_uniq', 'UNIQUE (my_special_id)', 'Must be unique.'),
    }

    _sql = """CREATE UNIQUE INDEX special_id_limited_uniq
            ON res_partner (my_special_id)
            WHERE my_special_id != 0
    """
res_partner()

私の目標は、次のようなフィールド (special_id_uniq) を持つことです。

  1. デフォルトはNULL
  2. 整数です
  3. NULL を除くすべての値で一意である

私の最初の本能は、上記の _sql_constraint 定義を作成することでしたが、これにより問題が発生しました。明らかに、OpenERP には null 許容整数フィールドがないため、'None' は 0 として扱われます。これにより、SQL 制約が破られ、0 の複数の値を許可する必要があります。 .

これを回避するために、モデルの _sql_constraints オプションを削除し、PostgreSQL 部分インデックスを作成する _sql コードを追加しました。動作することを確認するために、PostgreSQL で SQL を自分で実行したところ、目的の効果が得られました。ただし、OpenERP を使用して新しい DB を作成し、カスタム モジュールをインストールすると、この SQL は実行されません。これは、モデルが作成されていないためです。

def _auto_init(self, cr, context=None):
    #...
    create = not self._table_exist(cr)
    #...
    #Line 3046 of openerp/osv/orm.py version 6.1 function _auto_init
    if create:
        self._execute_sql(cr)
    #...

では、モジュールのインストール時にカスタム SQL を実行するにはどうすればよいでしょうか?

4

2 に答える 2

4

実際、私は自分の質問に答えたばかりかもしれません:override_auto_init。

編集:

はい、インストール/アップグレード中にSQLを実行するには次のように機能します。

def _auto_init(self, cr, context=None):
    ret = super(res_partner, self)._auto_init(cr, context)
    self._execute_sql(cr)
    return ret
于 2012-05-29T20:38:50.390 に答える
3

functionこれは、モジュールのデータ xml ファイルにエントリを追加することで実現できます。

<openerp>
  <data>
    <!-- ... your init data records ...-->
    <function model="res.partner" name="_my_init_mehod"/>
  </data>
</openerp>

標準モジュールでこれの実際の例を見ることができますdocument: インストールの最後にすべての添付ファイルを新しい DMS 構造に移行するdocument_data.xml 関数の呼び出しを宣言します。_attach_parent_id

于 2012-05-30T08:29:46.557 に答える