iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

Let's ODOO 開發與應用30天挑戰系列 第 5

Day5 Let's ODOO: Model(2) Fields

延續前日介紹,今天我們來講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

Model Fields

Fields對應的就是資料表內的欄位,我們可以設定Fields的型別以及內部屬性

Fields type

  • Boolean: 布林值,True or False
  • Char: 單行文字
  • Float: 浮點數
  • Integer: 整數
  • Binary: 二進位檔案,如圖片、附件
  • Html: 存html格式的多行文字
  • Date: 同python的Date,格式為YYYY-MM-DD
  • Datetime: 同python的Datetime,格式為YYYY-MM-DD HH:MM:SS
  • Selection: 下拉選單,如範例中的gender ,內部的選項也可以拉出來寫。
  • Monetary: 貨幣欄位,可以根據貨幣設定顯示符號
  • Text: 多行文字
  • Many2one: 多對一,如範例中school_id ,通常會以_id為命名結尾,代表多個學生會對應到一個學校,其中學校是以res_company建立的model。
  • One2many: 一對多,如範例中junior_ids,通常以_ids為命名結尾,代表一位學生有多個直屬學弟妹。
  • Many2many: 多對多, 如範例中teacher_ids,命名同One2many,以_ids結尾,代表多位學生會對應到多位指導老師。

Fields parameter

在宣告Fields的時候可以帶參數去控制屬性,如欄位顯示名稱、初始值、是否必填...等,有部分屬性是在指定型別才可以加,以下介紹常用的幾項屬性:

通用欄位:

  • string: 使用者在ODOO上看到欄位的名稱,如果沒有設定會沿用宣告名稱。
  • help: 敘述field用途,在開發者模式觀看fields時可以看到,幫助使用者了解。
  • invisible: 布林值,在ODOO上是否遮蔽欄位,預設為False
  • readonly: 布林值,是否只能讀,設為True 時代表無法寫入及修改。
  • required: 布林值,是否為必填欄位。
  • index: 是否為欄位增加index做為參考,預設是False
  • default: 為欄位增加預設值。
  • states: 透過dictionary方式可以控制 readonly, required, invisible 三項參數在UI上的顯示。
  • groups: 給予欄位access right,當不屬於允許的group時,此欄位不可見。
  • copy: 在複製整份資料的時候,此欄位的值是否一併複製,大部分的欄位預設為True,但One2many 欄位和計算欄位預設為False
  • store: 是否將field存到db table內,預設為True,只有計算欄位是False
  • compute: 指定method來計算此欄位的值,當有此參數時readonly=Truestore=False,如範例中的avg_score 此欄位透過_compute_total 方法計算出欄位的值,本身不會儲存於db內,除非設定store=True
  • related: 用於關聯資料,如範例中的school_city 便是參考school_id底下city的值。
  • company_dependent: 會根據不同company存取不同的值,如收款帳戶。

關聯欄位:

即是One2manyMany2oneMany2many三種fields會出現相關關聯參數:

  • comodel_name: 即是參考model名稱,如school_id參考的即是res_company
  • domain: 用於One2manyMany2one欄位,可以想成是一個Filter,可透過domain來篩選想要的資料,如範例中的teacher_ids 透過filter,我們在指定給學生老師的時候只會選到is_active=True的老師。
  • on_delete: 設定當關聯刪除時該怎麼設定此欄位的值,有set nullrestrictcascad三種狀態分別代表設成Null、無法刪除、刪除關聯資料。
  • limit: 限制可選資料個數。

自動新增欄位

ODOO會將預設欄位增加在model裡,也就是每個table中都會有此欄位:

  • id: 即是創建資料時,自動產生的index。
  • create_date: 建立資料日期時間。
  • create_uid: 建立資料人員id。
  • write_date: 修改資料日期時間。
  • write_uid: 修改資料人員id。

透過ODOO model的設定,ORM可以幫我們做很多db操作,省去不少麻煩,更多fields設定在ODOO Document也有解說,明天我們來介紹Model下的methods。


上一篇
Day4 Let's ODOO: Model(1) Class & Attribute
下一篇
Day6 Let's ODOO: Model(3) Decorators & Environment
系列文
Let's ODOO 開發與應用30天挑戰30

尚未有邦友留言

立即登入留言