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。


<<:  [Day20]The Huge One

>>:  [火锅吃到饱-6] 天圆地方职人锅物(台中)- 超高CP值的商业午餐 Business Set

第33天~

这个得上一篇在https://ithelp.ithome.com.tw/articles/10257...

25.移转 Aras PLM大小事-流程签核动态指派(4)

流程指派这件事情,还会依据流程关卡不同,有不同方向走法 像下图用自动节点指向两种路线 同样套用程序J...

第30篇

在这30天里我自己也学到了很多,从一开始的基础元件使用,到後面的资料库、触控感测等较有难度的程序,但...

Day 18 - Tally String Times with Reduce

前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...

C槽系统目录--Windows资料夹常识

从这篇开始,我们要介绍一些Windows系统常识,做为一个资工先了解Windows的系统结构,懂得问...