既存のモデルにいくつかのフィールドを追加するモジュールを 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) を持つことです。
- デフォルトはNULL
- 整数です
- 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 を実行するにはどうすればよいでしょうか?