iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
Software Development

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

Day7 Let's ODOO: Model(4) ORM API

本章節介紹ORM對資料庫的CURD方法,我們以上個章節介紹的student model 為例。

# -*- coding: utf-8 -*-

from odoo import api, models, fields
from odoo.exceptions import ValidationError

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.partner', string='指導老師', domain=[('is_company', '!=', True)])
    gender = fields.Selection([("male", "男"), ("female", "女"), ("other", "其他")], string='性別')
    is_leadership = fields.Boolean(default=False)
    is_active = fields.Boolean(default=True)

CREATE

create()

新增方法很直觀,直接對新增的欄位create即可。

env['res.student'].create({'name': '王大明', 'nickname': '小明', 'birthday': '2000-01-01'})

copy()

當一個資料裡可能含有許多field,我們想要其中一份一樣的資料,為了方便就可以使用copy。

env['res.student'].search([('name', '=', '王大明')]).copy()

UPDATE

write()

將當前的recordset根據指定的欄位修改

env['res.student'].search([('name', '=', '王大明')]).write({'nickname': '大明'})

要注意的是當需要新增或修改One2manyMany2many field時,ODOO有一套自己的寫法,這邊飲用ODOO的Document:

  • (0, 0, values) adds a new record created from the provided value dict.
  • (1, id, values)updates an existing record of id id with the values in values. Can not be used in create()
  • (2, id, 0) removes the record of id id from the set, then deletes it (from the database). Can not be used in create()
  • (3, id, 0) removes the record of id id from the set, but does not delete it. Can not be used in create()
  • (4, id, 0) adds an existing record of id id to the set.
  • (5, 0, 0) removes all records from the set, equivalent to using the command 3 on every record explicitly. Can not be used in create()
  • (6, 0, ids) replaces all existing records in the set by the ids list, equivalent to using the command 5 followed by a command 4 for each id in ids.

舉個例子,當我想為王大明增加一位還沒建資料的學弟妹,並將一位id=2的同學因為他作弊,修改他的成績為零分

first_val = {'name': '林小美', 'birthday': '2001-03-03'}
second_val = {'math_score': 0}
env['res.student'].search([('name', '=', '王大明')]).write('junior_ids': [(0, 0, first_val), (1, 2, second_val)])

READ

search()

ODOO中的domain可以想成是query條件,search可以尋找所需要的資料集。

env['res.student'].search([('is_active', '=', True )], limit=10)

我們尋找還在學的學生10位,[('is_active', '=', True )] 為domain的寫法,前者為參數,中間為運算元(operator),後面為值。

search_count()

search() 方法相同,只是最後只會return資料個數。

browse()

根據給予的ids陣列,return 資料。

env['res.student'].browse([2,3,6])

exists()

檢查recordset是否存在

DELETE

unlink()

刪除資料集

env['res.student'].search([('name', '=', '王大明')]).unlink()

Model所有的介紹就到這邊,筆者介紹的大部分都是自己用過或是比較常看到的,更多相關的參數或方法可以參考ODOO Document,明天將會介紹到View的章節。


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

尚未有邦友留言

立即登入留言