【odoo 10.0】模型(model)相關

參考鏈接
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容