2016-10-31 9 views
0

odoo 9にカスタムモジュールがあります。このモデルでは、私は動物とケージを持っています。odoo 9のモジュールをアンインストールした後にデータベーステーブルが削除されない

ケージでは、複数の動物を用いることができる。 動物は1つのケージにしか入れることができません。

私のモデルである:私はモジュールをインストールすると

class Animal(osv.osv): 
    _name = 'Animal' 
    _columns = { 
       'name': fields.char('Animal Name', size=2048), 
       'cage_id': fields.many2one('cage', required=True, ondelete='cascade', string="Cage"), 
    } 

class Cage(osv.osv): 
    _name = 'Cage' 
    _columns = { 
       'name': fields.char('Cage Name', size=100), 
       'animals': fields.one2many('Animal', 'cage_id', string="Animals"), 
       } 

、すべてが正常に動作します。しかし、私はそれをアンインストールしようとすると、テーブル「アニマル」はデータベース内に残り、コンソールにエラーがある:

2016-10-31 16:37:21,091 28082 INFO myserver openerp.addons.base.ir.ir_model: Unable to delete [email protected] 
Traceback (most recent call last): 
    File "/etc/odoo/server/openerp/addons/base/ir/ir_model.py", line 1269, in unlink_if_refcount 
    self.pool[model].unlink(cr, uid, [res_id], context=context) 
    File "/etc/odoo/server/openerp/api.py", line 250, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/etc/odoo/server/openerp/addons/base/ir/ir_model.py", line 461, in unlink 
    self.browse(cr, user, ids, context=context)._prepare_update() 
    File "/etc/odoo/server/openerp/api.py", line 248, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/etc/odoo/server/openerp/addons/base/ir/ir_model.py", line 449, in _prepare_update 
    raise UserError(msg % (field, model._field_inverses[field][0])) 
UserError: (u"The field 'animal.cage_id' cannot be removed because the field 'cage.passwords' depends on it.", None) 

私は、公式ドキュメントをレビューしてきたが、私は、エラーを見つけることができませんしています。

モデルで何が問題になっていますか?

答えて

1

@MouTio、

私はあなたがV9で、伝統的なv7のAPIを使用していることが観察され、古いAPIは、DB関係に矛盾がたくさんあったとして、それは大きな赤い旗です。だからあなたの移行のコードは以下のように見えるかもしれ

  1. Porting from the old API to the new API
  2. Odoo new API guideline

from openerp import api, fields, models, _ 

class Cage(models.Model): 
    _name = 'cage' 

    name = fields.Char(string='Cage Name', size=100) 
    animals = fields.One2many(comodel_name='Animal', inverse_name='cage_id', string="Animals") 


class Animal(models.Model): 
    _name = 'animal' 

    name = fields.Char(string='Animal Name', size=2048), 
    cage_id = fields.Many2one(comodel_name='cage', required=True, ondelete='cascade', string="Cage") 
むしろ私は、次のガイドラインを使用して、新しいAPIにあなたのモジュールを移行するために、あなたをアドバイスします

またここで気付くべき重要なことが1つあります。many2oneは、関係テーブルhaの前に定義されてメモリ/ DBにロードできませんone2manyはDB内のハードな関係ではないため、はDB内では硬いFKとして作成されましたが、逆モデルではone2manyという関係モデルがロードされる前にフィールドを定義することができます。

新しいAPIにコードを移植してアンインストールを試みてください。ただし、ここで注意してください.Oudooはモジュールのアンインストールについてはアドバイスしませんが、残念ながらドキュメントには書かれませんでした。

1

cage.passwordsには、animal.cage_idの要件があります。cage_idを削除する必要があります。 models.Modelosvではなく)に変換することもできます。 osvモデルでondelete = 'set null'を指定できるかどうかはわかりません。

+0

ondelete = 'cascade'ディレクティブがあります。とにかく、コードを新しいAPI(osv.osvではなくmodels.Model)に移行してから、表の列は作成されません。何故ですか? – MouTio

関連する問題