延續前日介紹,今天我們來講Model內的fields延續昨日範例
# -*- coding: utf-8 -*-
from odoo import api, models, fields
class ResStudent(models.Model):
_name = 'res.student'
_inherit = 'res.partner'
_description = 'Student'
nickname = fields.Char(string='綽號')
math_score = fields.Float(string='數學成績')
chinese_score = fields.Float(string='國文成績')
avg_score = fields.Float(string='學期平均', compute='_compute_score')
birthday = fields.Date(string='生日', required=True)
school_id = fields.Many2one('res.company', string='所屬學校')
school_city = fields.Char(string='所在城市', related='school_id.city')
senior_id = fields.Many2one('res.student', string='直屬學長姐')
junior_ids = fields.One2many('res.student', 'senior_id', string='直屬學弟妹')
teacher_ids = fields.Many2many('res.teacher', string='指導老師', domain=[('is_active', '=', True)])
gender = fields.Selection([("male", "男"), ("female", "女"), ("other", "其他")], string='性別')
is_leadership = fields.Boolean(default=False)
@api.depends('math_score', 'chinese_score')
def _compute_total(self):
for record in self:
record.avg_score = (record.math_score + record.chinese_score) / 2
Fields對應的就是資料表內的欄位,我們可以設定Fields的型別以及內部屬性
True
or False
gender
,內部的選項也可以拉出來寫。school_id
,通常會以_id
為命名結尾,代表多個學生會對應到一個學校,其中學校是以res_company
建立的model。junior_ids
,通常以_ids
為命名結尾,代表一位學生有多個直屬學弟妹。teacher_ids
,命名同One2many,以_ids
結尾,代表多位學生會對應到多位指導老師。在宣告Fields的時候可以帶參數去控制屬性,如欄位顯示名稱、初始值、是否必填...等,有部分屬性是在指定型別才可以加,以下介紹常用的幾項屬性:
通用欄位:
False
。True
時代表無法寫入及修改。False
。readonly
, required
, invisible
三項參數在UI上的顯示。True
,但One2many
欄位和計算欄位預設為False
。False
。readonly=True
、store=False
,如範例中的avg_score
此欄位透過_compute_total
方法計算出欄位的值,本身不會儲存於db內,除非設定store=True
。school_city
便是參考school_id
底下city的值。關聯欄位:
即是One2many
、Many2one
、Many2many
三種fields會出現相關關聯參數:
school_id
參考的即是res_company
。One2many
、Many2one
欄位,可以想成是一個Filter,可透過domain來篩選想要的資料,如範例中的teacher_ids
透過filter,我們在指定給學生老師的時候只會選到is_active=True
的老師。set null
、restrict
、cascad
三種狀態分別代表設成Null、無法刪除、刪除關聯資料。ODOO會將預設欄位增加在model裡,也就是每個table中都會有此欄位:
透過ODOO model的設定,ORM可以幫我們做很多db操作,省去不少麻煩,更多fields設定在ODOO Document也有解說,明天我們來介紹Model下的methods。