---
# System prepended metadata

title: 隨手筆記 - ODOO 的 Model 繼承模式詳記
tags: [' 隨手筆記', ODOO]

---

---
tags: ODOO, 隨手筆記
---

# 隨手筆記 - ODOO 的 Model 繼承模式詳記

## 撰文動機
原本希望可以像 Django 一樣，可以從 A model 關聯 B model 的欄位，關聯到 C model 的欄位，結果發現這個沒辦法在 xml 中實現，只好把 model 這塊的繼承關係學起來了:)

## 繼承模式
在 Odoo 的繼承里總共分成三種模式，以下使用官方提供的圖做解釋。
![](https://i.imgur.com/5NfPZNV.png)

### 第一種 - 擴充原始 Model (直接擴充)
sample:
```python
class OriginModel(models.Model):
    _name = "<original_model_id>"
    _inherit = "<original_model_id>"
```

用處:
- 直接在原本的資料表中擴充欄位。
- 需要用到該 Model 本來的 View。
- 需要存取原 Model 的原始資料

### 第二種 - 擴充原始 Model (關聯擴充)
sample:
```python
class NewModel(models.Model):
    _name = "<new_model_id>"
    _inherit = "<original_model_id>"
```

用處:
- 不想影響到原本的資料表及欄位。
- 不需用到原本 Model 的 View。

### 第三種 - 多重繼承 Model
sample:
```python
class NewModel(models.Model):
    _name = "<new_model_id>"
    _inherits = {"<original_model_id_1>":"<field_id_1>"},
    {"<original_model_id_2>":"<field_id_2>"}, ...
```

用處:
- 不想影響原本的資料表，但需要原 Model 的資料
- 需要繼承多個既有的 Model


## 結語
基本上分成這三種模式，基本上可以適用於目前所有的模式了，只需要按照適合的場景選用不同的方式就好，唯一一個需要小心的就是擴充原本資料表的方式。