Openerp 在odoo 9中卸载模块后未删除数据库表

Openerp 在odoo 9中卸载模块后未删除数据库表,openerp,odoo-9,Openerp,Odoo 9,我有一个自定义模块在奥多9。在模型中,我有动物和笼子 笼子里可以有不止一只动物。 一只动物只能在一个笼子里 这就是我的模型: class Animal(osv.osv): _name = 'Animal' _columns = { 'name': fields.char('Animal Name', size=2048), 'cage_id': fields.many2one('cage', required=Tru

我有一个自定义模块在奥多9。在模型中,我有动物和笼子

笼子里可以有不止一只动物。 一只动物只能在一个笼子里

这就是我的模型:

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"),
                }
当我安装模块时,一切正常。但是如果我尝试卸载它,表“Animal”仍保留在数据库中,并且控制台中有一个错误:

2016-10-31 16:37:21,091 28082 INFO myserver openerp.addons.base.ir.ir_model: Unable to delete 7565@ir.model.fields
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)
我已经审阅了官方文档,但无法找到错误


模型中有什么问题?

cage。密码对
动物有要求。cage\u id
如果
cage\u id
被删除,您需要留出空间。您可能还希望转换为
模型。模型
不是
osv
。我不确定您是否可以在osv模型中提供ondelete='set null'。

@MouTio

我注意到您在v9中使用的是传统的V7API,这是一个很大的危险信号,因为旧的api与Db关系有很多不一致之处。相反,我建议您使用以下准则将模块迁移到新API:

  • 因此,迁移的代码可能如下所示:

    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")
    
    还有一件重要的事情需要注意,
    manyOne
    无法在关系表创建之前定义并加载到内存/DB中,因为
    manyOne
    在DB中是硬的
    FK
    ,而在反向
    one2many
    中,即使在关系模型加载之前也可以定义字段,因为
    one2many
    在数据库中不是硬关系


    请将您的代码移植到新的API,然后尝试卸载,但请注意,在这里,Odoo不建议卸载模块,但遗憾的是,他们从未在任何文档中编写该模块,也从未公开发布过该模块。

    有一个ondelete='cascade'指令。无论如何,我已经将代码迁移到了新的API(使用models.Model而不是osv.osv),然后就不会创建表的列了。为什么呢?