Odoo,在同一视图中不能有两个不同的兄弟对象
Odoo, can't have two different siblings objects in the same view
我有一个名为 detail_base 的 class,还有另外两个 class 名为 flight_detail 和tour_detail,后两个class继承了第一个,像这样:
class DetailBase(models.Model):
_name = 'detail_base'
fee = fields.Monetary('Fee')
passenger = fields.Char('Passenger')
class FlightDetail(models.Model):
_name = 'flight_detail'
_inherits = 'detail_base'
passport = fields.Char('Passport')
class TourDetail(models.Model):
_name = 'tour_detail'
_inherits = 'detail_base'
age = fields.Integer('Tourist Age')
问题是当我在同一视图中调用 flight_detail 和 tour_detail 时,浏览器无法处理两个 classes 的公共属性,如果我将 5 分配给 tour_detail.fee,那number 将存储到 flight_detail.fee.
看来问题与不同对象的同名属性是siblings有关。
如有任何帮助,我将不胜感激。
您应该使用 _inherit
class DetailBase(models.AbstractModel):
_name = 'detail_base'
fee = fields.Monetary('Fee')
passenger = fields.Char('Passenger')
class FlightDetail(models.Model):
_name = 'flight_detail'
_inherit = 'detail_base'
passport = fields.Char('Passport')
class TourDetail(models.Model):
_name = 'tour_detail'
_inherit = 'detail_base'
age = fields.Integer('Tourist Age')
应该创建 3 个数据库 tables (detail_base
as Model
) 或 2 个数据库 tables (AbstractModel
).
或者您使用 _inherits
如:
class DetailBase(models.Model):
_name = 'detail_base'
fee = fields.Monetary('Fee')
passenger = fields.Char('Passenger')
class FlightDetail(models.Model):
_name = 'flight_detail'
_inherits = {'detail_base': 'base_id'}
passport = fields.Char('Passport')
base_id = fields.Many2one('detail_base', required=True, ondelete='cascade')
class TourDetail(models.Model):
_name = 'tour_detail'
_inherit = {'detail_base': 'base_id'}
age = fields.Integer('Tourist Age')
base_id = fields.Many2one('detail_base', required=True, ondelete='cascade')
这将创建 3 个 table,并且 fee
和 passenger
将存储在 detail_base
table 中。 Odoo 将从那里获取它,因为它是一种委托继承。
使用继承:
1- 不带_name 继承:
inherit = 'model.name'
new_field = fields...
将此字段添加到 model.name
2- 继承自 _name:
inherit = 'model.name'
_name = 'new.model'
此处将在数据库中创建一个具有与model.name相同结构的新表。
inherits:委托继承。
最好的例子是 res.users
并且 res.partners
用户是合作伙伴,所以当我们创建 res.users
记录时,我们必须创建一个 res.partener
来保存像名称这样的公共字段,电子邮件、地址...以及与用户相关的信息(如 passowrd 和登录名)存储在 res.users
模型中,通过继承类型,您可以直接访问 res.partener 的字段,而无需创建相关字段。您可以 user_record.name
或 .email
或 .address
这不会有问题。
我喜欢将其视为一对一的关系。
_inherits = {model.name : many2one_field_id }
_name = 'new.model'
# m2o field should be required and ondelete = cascade
many2one_field_id = fields.Many2one('model.name', string='Label', required=True, ondelete="cascade")
因此,当您创建 new.model 的记录时,model.name
中的所有字段都将存储在 model.name
中。