Odoo 如何覆盖默认函数 new API
Odoo how overwrite default function new API
我正在尝试覆盖 class 消息 方法
def _get_default_author(self) 通过这个例子:
原机型:
class Message(models.Model):
_name = 'mail.message'
_inherit = ['ir.needaction_mixin']
@api.model
def _get_default_author(self):
return self.env.user.partner_id
author_id = fields.Many2one(
'res.partner', 'Author', select=1,
ondelete='set null', default=_get_default_author,
help="Author of the message. If not set, email_from may hold an email address that did not match any partner.")
继承模型:
class MyClass(models.Model):
_name = 'my.class'
_inherit = ['mail.thread', 'ir.needaction_mixin']
@api.model
def _get_default_author(self):
new = self.env['res.users'].search([('id', '=', '1')])
return new.partner_id
author_id = fields.Many2one(default=_get_default_author)
但是我得到一个错误:
File "/opt/odoo/openerp/models.py", line 4113, in create
vals = self._add_missing_default_values(vals)
File "/opt/odoo/openerp/api.py", line 236, in wrapper
return new_api(self, *args, **kwargs)
File "/opt/odoo/openerp/api.py", line 478, in new_api
result = method(self._model, cr, uid, *args, **old_kwargs)
File "/opt/odoo/openerp/models.py", line 1776, in _add_missing_default_values
defaults = self.default_get(cr, uid, list(missing_defaults), context)
File "/opt/odoo/openerp/api.py", line 238, in wrapper
return old_api(self, *args, **kwargs)
File "/opt/odoo/openerp/api.py", line 342, in old_api
result = method(recs, *args, **kwargs)
File "/opt/odoo/openerp/models.py", line 1336, in default_get
defaults = self._convert_to_cache(defaults, validate=False)
File "/opt/odoo/openerp/models.py", line 5454, in _convert_to_cache
for name, value in values.iteritems()
File "/opt/odoo/openerp/models.py", line 5455, in <dictcomp>
if name in fields
File "/opt/odoo/openerp/fields.py", line 1655, in convert_to_cache
raise ValueError("Wrong value for %s: %r" % (self, value))
ValueError: Wrong value for my.class.author_id: res.partner(3,)
我做错了什么?也许还有另一种方法可以覆盖默认功能?
更新:
只是为了测试,我对核心 class Message(models.Model) 进行了相同的更改。一切都很好。据我了解,问题出在我的代码上。可能是我覆盖错了..
您不是在覆盖或扩展 mail.message
,而是在创建您自己的模型 my.class
。要扩展或覆盖 Odoo 模型,您只需使用 _inherit
class 属性:
class MyClass(models.Model):
_inherit = 'mail.message'
_name = 'mail.message' # optional!
@api.model
def _get_default_author(self):
new = self.env['res.users'].search([('id', '=', '1')])
return new.partner_id
author_id = fields.Many2one(default=_get_default_author)
现在是你的错误。您正在使用字段 author_id
创建自己的模型 my.class
。这个字段是一个many2one关系字段,它总是需要一个comodel来获得一个关系。通过思考 "i will override another models default function" 你当然没有填写 comodel_name
参数,因为在覆盖时,不需要。
但你并没有压倒一切。所以 Odoo 正在用 object() 填充 comodel_name
。您的默认方法是返回 res.partner
记录,但 Odoo 需要 object
记录。
所以错误只是现有 Odoo 模型 inheriting/overriding 错误尝试的后遗症。
我正在尝试覆盖 class 消息 方法
def _get_default_author(self) 通过这个例子:
原机型:
class Message(models.Model):
_name = 'mail.message'
_inherit = ['ir.needaction_mixin']
@api.model
def _get_default_author(self):
return self.env.user.partner_id
author_id = fields.Many2one(
'res.partner', 'Author', select=1,
ondelete='set null', default=_get_default_author,
help="Author of the message. If not set, email_from may hold an email address that did not match any partner.")
继承模型:
class MyClass(models.Model):
_name = 'my.class'
_inherit = ['mail.thread', 'ir.needaction_mixin']
@api.model
def _get_default_author(self):
new = self.env['res.users'].search([('id', '=', '1')])
return new.partner_id
author_id = fields.Many2one(default=_get_default_author)
但是我得到一个错误:
File "/opt/odoo/openerp/models.py", line 4113, in create
vals = self._add_missing_default_values(vals)
File "/opt/odoo/openerp/api.py", line 236, in wrapper
return new_api(self, *args, **kwargs)
File "/opt/odoo/openerp/api.py", line 478, in new_api
result = method(self._model, cr, uid, *args, **old_kwargs)
File "/opt/odoo/openerp/models.py", line 1776, in _add_missing_default_values
defaults = self.default_get(cr, uid, list(missing_defaults), context)
File "/opt/odoo/openerp/api.py", line 238, in wrapper
return old_api(self, *args, **kwargs)
File "/opt/odoo/openerp/api.py", line 342, in old_api
result = method(recs, *args, **kwargs)
File "/opt/odoo/openerp/models.py", line 1336, in default_get
defaults = self._convert_to_cache(defaults, validate=False)
File "/opt/odoo/openerp/models.py", line 5454, in _convert_to_cache
for name, value in values.iteritems()
File "/opt/odoo/openerp/models.py", line 5455, in <dictcomp>
if name in fields
File "/opt/odoo/openerp/fields.py", line 1655, in convert_to_cache
raise ValueError("Wrong value for %s: %r" % (self, value))
ValueError: Wrong value for my.class.author_id: res.partner(3,)
我做错了什么?也许还有另一种方法可以覆盖默认功能?
更新: 只是为了测试,我对核心 class Message(models.Model) 进行了相同的更改。一切都很好。据我了解,问题出在我的代码上。可能是我覆盖错了..
您不是在覆盖或扩展 mail.message
,而是在创建您自己的模型 my.class
。要扩展或覆盖 Odoo 模型,您只需使用 _inherit
class 属性:
class MyClass(models.Model):
_inherit = 'mail.message'
_name = 'mail.message' # optional!
@api.model
def _get_default_author(self):
new = self.env['res.users'].search([('id', '=', '1')])
return new.partner_id
author_id = fields.Many2one(default=_get_default_author)
现在是你的错误。您正在使用字段 author_id
创建自己的模型 my.class
。这个字段是一个many2one关系字段,它总是需要一个comodel来获得一个关系。通过思考 "i will override another models default function" 你当然没有填写 comodel_name
参数,因为在覆盖时,不需要。
但你并没有压倒一切。所以 Odoo 正在用 object() 填充 comodel_name
。您的默认方法是返回 res.partner
记录,但 Odoo 需要 object
记录。
所以错误只是现有 Odoo 模型 inheriting/overriding 错误尝试的后遗症。