以下是我簡單的跟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_id
與model category
關聯而book_id
會與category
的Primary 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_name
跟author_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字段中刪除記錄