iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
Odoo

Odoo16 入門介紹系列 第 14

Day14_odoo_關聯欄位總結

  • 分享至 

  • xImage
  •  

以下是我簡單的跟SQL Table所做的比對:

Many2one(多對一):

Many2one筆者認為其實就是單純的使用了foreign key,最大的原因就是因為當你在使用Many2one時,
你會設定一個欄位與另一個Table做關聯,也就是外鍵關聯(foreign key relationship),如 Day11 的例子:

class BookName(models.Model):
    _name = 'book.name'
    _description = "book's name model"
    
    name = fields.Char(string='Name', required=True)
    book_id = fields.Many2one('category', string='Category', required=True)
    

也就是說book_idmodel category關聯而book_id會與categoryPrimary key做對應。

Many2many(多對多):

Many2many就會是使用我們所設定的兩個Table中,Foreign Key來做為一個Table,也就是所謂的多重外鍵關係(composite foreign key relationship),如 Day12 :

class BookName(models.Model):
    _name = 'book.name'
    _description = "book's name model"
    
    name = fields.Char(string='Name', required=True)
    author = fields.Many2many('author', 'author_book_name_tag', 
                         'book_name', 'author_name',string='Author')

在這當中兩個Foreign key分別是book_nameauthor_name,彼此之間對應,對方多的欄位。

One2many(一對多):

而在odoo中,One2many是使用反向的Many2one來作呈現,所以其本質就是外鍵關聯(foreign key relationship),但特別要注意的是,使用上你必須要先有Many2one,然後你在設定One2many時,你也必須宣告一個名稱,如 Day13 :

class BookName(models.Model):
    _name = 'book.name'
    _description = "book's name model"
    
    name = fields.Char(string='Name', required=True)
    book_id = fields.Many2one('category', string='Category', required=True)

class Category(models.Model):
    _name = 'category'
    _description = "category's model"
    
    name = fields.Char(string='Name', required=True)
    category_id = fields.One2many('book.name', 'book_id', string='Book's Name ID')

另外補充odoo提供了一組可用於與相關記錄進行交互的API:

Many2one API:

設定(Set)值: 將many2one字段的值設定為其他記錄。

record.many2one_field = other_record  # 將many2one字段設定為other_record

獲取(Get)值: 獲取many2one字段的值。

related_record = record.many2one_field  # 獲取many2one字段的值

Many2many API:

設定(Set)值: 將many2many字段的值設定為包含一個或多個記錄的列表。

record.many2many_field = [(4, id1), (4, id2), ...]  # 添加記錄到many2many字段

添加(Add)值: 將一個或多個記錄添加到many2many字段。

record.many2many_field = [(4, id1), (4, id2)]  # 添加記錄到many2many字段

刪除(Remove)值: 從many2many字段中刪除一個或多個記錄。

record.one2many_field = [(0, 0, {'field1': value1, 'field2': value2}), ...]  
   # 設定one2many字段的值

One2many API:

設定(Set)值: 將one2many字段的值設定為包含一個或多個字典的列表。

record.one2many_field = [(0, 0, {'field1': value1, 'field2': value2}), ...]  
   # 設定one2many字段的值

添加(Add)值: 添加一個新記錄到one2many字段。

record.one2many_field = [(4, 0, 0)]  # 添加新記錄到one2many字段

刪除(Remove)值: 從one2many字段中刪除一個或多個記錄。

record.one2many_field = [(2, id)]  # 從one2many字段中刪除記錄

上一篇
Day13_odoo_One2many
下一篇
Day15_odoo_Class Inheritance
系列文
Odoo16 入門介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言