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_detailtour_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,并且 feepassenger 将存储在 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 中。