參考鏈接
https://www.odoo.com/documentation/10.0/howtos/backend.html#relations-between-models
https://www.odoo.com/documentation/10.0/howtos/backend.html#inheritance
模型關聯
odoo的模型關聯初步來看和數據庫表關聯一樣,分為三種關聯方式:多對多,多對一,一對多,這三種方式的關聯與數據庫通過外鍵建表最后的成果是一樣的。只不過odoo將一些數據庫的sql操作,封裝成了fields的方法。
-
Many2one(comodel_name=<object object>, string=<object object>, **kwargs)
多對一關系,在models文件中通過fields.Many2one聲明
project_id = fields.Many2one('demo.project', ondelete='cascade', string=u'所屬項目')
聲明的結果是:會在數據庫聲明的表單中增加一個字段,字段名就是上句中的變量名
Many2one One2many(comodel_name=<object object>, inverse_name=<object object>, string=<object object>, kwargs)
一對多關系,是一個虛擬的表關系,依賴于Many2one,通過fields.One2many聲明。注意:該關系需要many-表中已經聲明Many2one,否則失效inverse_name為many表中Many2one的字段名
attachment_ids = fields.One2many('demo.attachment', 'project_id', string=u'附件列表')
Many2many(comodel_name=<object object>, relation=<object object>, column1=<object object>, column2=<object object>, string=<object object>, **kwargs)
多對多關系,通過fields.Many2many聲明。
user_ids = fields.Many2many('res.partner', string='Attendees')
聲明的結果是,數據庫會生成一個表單,維護兩個表的map id
模型繼承
- 模型擴展繼承
在原模型對象基礎上,繼承原模型的屬性,可以添加元素。不能修改原元素。
在數據庫中,新模型對象增加的字段,實際是在原模型對象的數據庫表單中添加的字段,沒有新建表單。(兼容原模型,因為表單并沒有改變)
class Extension0(models.Model):
_name = 'extension.0'
name = fields.Char(default="A")
class Extension1(models.Model):
_inherit = 'extension.0'
description = fields.Char(default="Extended")
- 經典繼承
在原模型對象的基礎上,繼承原模型的屬性,可以增加,重寫原元素。
在數據庫中,新建表單,復制了原模型對象的表單屬性。和類的繼承差不多。
class Inheritance0(models.Model):
_name = 'inheritance.0'
name = fields.Char()
def call(self):
return self.check("model 0")
def check(self, s):
return "This is {} record {}".format(s, self.name)
class Inheritance1(models.Model):
_name = 'inheritance.1'
_inherit = 'inheritance.0'
def call(self):
return self.check("model 1")
- 委托繼承
支持多重繼承,通過list繼承多個對象
class Child0(models.Model):
_name = 'delegation.child0'
field_0 = fields.Integer()
class Child1(models.Model):
_name = 'delegation.child1'
field_1 = fields.Integer()
class Delegating(models.Model):
_name = 'delegation.parent'
_inherits = {
'delegation.child0': 'child0_id',
'delegation.child1': 'child1_id',
}
child0_id = fields.Many2one('delegation.child0', required=True, ondelete='cascade')
child1_id = fields.Many2one('delegation.child1', required=True, ondelete='cascade')
使用
super(TestDelegation, self).setUp()
env = self.env
record = env['delegation.parent'].create({
'child0_id': env['delegation.child0'].create({'field_0': 0}).id,
# children fields can be looked up on the parent record directly
env = self.env
record.field_0
record.field_1