odoo 開發入門教程系列-模型和基本欄位

来源:https://www.cnblogs.com/shouke/archive/2023/03/24/17253304.html
-Advertisement-
Play Games

模型和基本欄位 在上一章的末尾,我們創建一個odoo模塊。然而,此時它仍然是一個空殼,不允許我們存儲任何數據。在我們的房地產模塊中,我們希望將與房地產相關的信息(名稱(name)、描述(description)、價格(price)、居住面積(living area)…)存儲在資料庫中。odoo框架提 ...


模型和基本欄位

在上一章的末尾,我們創建一個odoo模塊。然而,此時它仍然是一個空殼,不允許我們存儲任何數據。在我們的房地產模塊中,我們希望將與房地產相關的信息(名稱(name)、描述(description)、價格(price)、居住面積(living area)…)存儲在資料庫中。odoo框架提供了資料庫交互的工具

開始練習前,請確保estate模塊已被安裝,也就是說必須以installed的狀態出現在Apps列表中,如下

對象關係映射(Object-Relational Mapping)

參考: 和本主題關聯文檔可參考 Models API.

ORM 層是odoo的一個關鍵組件。該層避免了手動寫入大部分SQL並提供可擴展性和安全服務.

業務對象被定義為繼承於 Model的Python類。可以通過在定義中設置屬性來配置model。最重要的屬性為 _name,該屬性定義了model在odoo系統中的屬性。以下為model的最小化定義:

from odoo import models

class TestModel(models.Model):
    _name = "test.model"

該定義足夠ORM生成一張名為test_model的表。model _name中的 . 會被ORM自動化轉為_ 。按約定所有的model位於一個名為 models 的目錄,並且每個mode被定義為一個Python文件。

來看下 crm_recurring_plan 表是怎麼定義的,以及對應Python文件是怎麼導入的:

  1. odoo/addons/crm/models/crm_recurring_plan.py 中定義model(源碼鏈接)

    # -*- coding: utf-8 -*-
    # Part of Odoo. See LICENSE file for full copyright and licensing details.
    
    from odoo import fields, models
    
    
    class RecurringPlan(models.Model):
        _name = "crm.recurring.plan"
        _description = "CRM Recurring revenue plans"
        _order = "sequence"
    
        name = fields.Char('Plan Name', required=True, translate=True)
        number_of_months = fields.Integer('# Months', required=True)
        active = fields.Boolean('Active', default=True)
        sequence = fields.Integer('Sequence', default=10)
    
        _sql_constraints = [
            ('check_number_of_months', 'CHECK(number_of_months >= 0)', 'The number of month can\'t be negative.'),
        ]
    
  2. crm/models/__init__.py中導入crm_recurring_plan.py (源碼鏈接)

    # -*- coding: utf-8 -*-
    # Part of Odoo. See LICENSE file for full copyright and licensing details.
    
    from . import res_users
    from . import calendar
    from . import crm_lead
    from . import crm_lost_reason
    from . import crm_stage
    from . import crm_team
    from . import ir_config_parameter
    from . import res_config_settings
    from . import res_partner
    from . import digest
    from . import crm_lead_scoring_frequency
    from . import utm
    from . import crm_recurring_plan
    
  3. crm/__init__.py中導入models包 (源碼鏈接)

    # -*- coding: utf-8 -*-
    # Part of Odoo. See LICENSE file for full copyright and licensing details.
    
    from . import controllers
    from . import models
    from . import report
    from . import wizard
    
    from odoo import api, SUPERUSER_ID
    

練習

創建estate_property表的最小化模型

  1. odoo14/custom/estate/models/estate_property.py 中定義model

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from odoo import model
    
    class EstateProperty(models.Model):
        _name = 'estate.property'
    
  2. estate_property.pyodoo14/custom/estate/models/__init__.py中導入

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from . import estate_property
    
  3. estate/__init__.py中導入 models

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from . import models
    

重啟odoo服務

python odoo-bin --addons-path=custom,odoo/addons -r myodoo -w test123 -d odoo -u estate

-u estate 表示更新 estate 模塊,也就是說ORM將應用資料庫模式變更。

啟動過程中可以看到類似以下告警日誌:

...
2022-12-14 06:46:02,771 23792 WARNING odoo odoo.models: The model estate.property has no _description 
2022-12-14 06:46:02,920 23792 WARNING odoo odoo.models: The model estate.property has no _description 
...
2022-12-14 06:46:03,498 23792 WARNING odoo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...
...

以防萬一,可以看下到資料庫看下表是否創建成功。pgAmin查看路徑:Servers -> PostgreSQL 12 -> Databases (x) ->資料庫名 -> Schemas -> public -> Tables

模型欄位(Model Fields)

參考: 該主題相關文檔可參考 Fields API

欄位用於定義model可以存儲啥及在哪裡存儲。 Fields被定義為model類的屬性:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test.model"
    _description = "Test Model"

    name = fields.Char()

name 欄位被定義為Char,代表Python unicode的 str 和SQL的 VARCHAR.

有兩大類領域欄位:‘簡單’欄位--直接存儲在模型表中的原子值,形如Boolean, Float, Char, Text, DateSelection, ‘關係型’ 欄位--連接相同或者不同模型的記錄。

給模型表estate_property添加欄位

添加以下欄位到表中

Field Type
name Char
description Text
postcode Char
date_availability Date
expected_price Float
selling_price Float
bedrooms Integer
living_area Integer
facades Integer
garage Boolean
garden Boolean
garden_area Integer
garden_orientation Selection

The garden_orientation 欄位必須有4種可選值:‘North’, ‘South’, ‘East’ 和‘West’。Selection(選擇列表)定義為元組列表,查看示例

修改odoo14/custom/estate/models/estate_property.py文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from odoo import models,fields


class EstateProperty(models.Model):
    _name = 'estate.property'
    _description = 'estate property table'

    name = fields.Char(size=15)
    description = fields.Text()
    postcode = fields.Char(size=15)
    date_availability = fields.Datetime('Availability Date')
    expected_price = fields.Float('expected price', digits=(8, 2)) # 最大8位,小數占2位
    selling_price = fields.Float('selling price', digits=(8, 2))
    bedrooms = fields.Integer()
    living_area = fields.Integer()
    facades = fields.Integer()
    garage = fields.Boolean('garage')
    garden = fields.Boolean('garden')
    garden_area = fields.Integer()
    garden_orientation = fields.Selection(
        string='Orientation',
        selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('West','West')],
        help="garden orientation"
    )

重啟odoo服務

python odoo-bin --addons-path=custom,odoo/addons -r myodoo -w test123 -d odoo -u estate

資料庫中驗證

常見屬性

現在假設要求 nameexpected_price欄位值不為null,所以需要對其修改,如下,添加欄位屬性配置required=True

name = fields.Char(required=True)
expected_price = fields.Float('expected price', digits=(8, 2),  required=True) # 最大8位,小數占2位

修改後重啟odoo服務。

有些屬性是所有欄位都擁有的,最常見的幾個屬性如下:

  • string (str, default: 欄位名稱)

    UI上顯示為欄位的label (用戶可見).

  • required (bool, default: False)

    如果為 True, 表示該欄位值不能為空。創建記錄時必須擁有預設值或給定的值。

  • help (str, default: '')

    UI上為用戶提供long-form 幫助提示

  • index (bool, default: False)

    要求odoo在該列上創建資料庫索引

自動創建的欄位(Automatic Fields)

參考: 該話題相關文檔可參考 Automatic fields.

odoo會在所有model(當然,也可以配置禁止自動創建某些欄位)中創建少數欄位。這些欄位有系統管理並且不能寫,但是可以讀取,如果必要的話:

  • id (Id)

    model記錄的唯一標識

  • create_date (Datetime)

    記錄創建日期

  • create_uid (Many2one)

    記錄創建人

  • write_date (Datetime)

    記錄最後修改時間

  • write_uid (Many2one)

    記錄最後修改人

作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
           微信打賞                        支付寶打賞                  全國軟體測試交流QQ群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • NPM(Node Package Manager)是 Node.js 的包管理工具,用來安裝各種 Node.js 的擴展。 NPM是 JavaScript 的包管理工具,也是世界上最大的軟體註冊表。有超過 60 萬個 JavaScript 代碼包可供下載,每周下載約 30 億次。NPM讓 JavaS ...
  • 響應式基本原理就是,在初始化vue實例的時候,對data的每一個屬性都通過 Object.defineProperty 定義一次,在數據被set的時候,做一些操作,改變相應的視圖 ...
  • JavaScript(簡稱“JS”)是當前最流行、應用最廣泛的客戶端腳本語言,用來在網頁中添加一些動態效果與交互功能,在 Web 開發領域有著舉足輕重的地位。JavaScript 與 HTML 和 CSS 共同構成了我們所看到的網頁,其中: HTML 用來定義網頁的內容,例如標題、正文、圖像等; C ...
  • Vue是一款國產前端框架,它的作者尤雨溪(Evan You)是一位美籍華人,2014年2月,尤雨溪開源了一個前端開發庫 Vue.js,2015年發佈1.0.0版本,2016年4月發佈2.0版本,目前,尤雨溪全職投入 Vue.js 的開發與維護,立志將 Vue.js 打造成與 Angular/Reac ...
  • 外觀模式(Facade Pattern):它提供了一個簡單的介面,用於訪問複雜的系統或子系統。通過外觀模式,客戶端可以通過一個簡單的介面來訪問複雜的系統,而無需瞭解系統內部的具體實現細節。 在前端開發中,外觀模式常常被用於封裝一些常用的操作,以簡化代碼複雜度和提高代碼可維護性。比如,一個用於處理數據 ...
  • 最近,在看 LPL 比賽的時候,看到這樣一個有意思的六芒星能力圖動畫: 今天,我們就來使用純 CSS 實現這樣一個動畫效果! 實現背景網格 對於如下這樣一個背景網格,最好的方式當然肯定是切圖,或者使用 SVG 路徑。 如果一定要使用 CSS,勉強也能做,這就涉及了不規則圖形邊框效果,我們有一些方式可 ...
  • title: "modern C++ DesignPattern-Part3" date: 2018-04-12T19:08:49+08:00 lastmod: 2018-04-12T19:08:49+08:00 keywords: [設計模式, C++] tags: [設計模式] categori ...
  • 關於指針、數組、字元串的恩怨,這裡有你想知道的一切 記憶體組成、字元串定義、一/二維數組結構、數組中的指針等價關係、數組結構中對“指針常量”的理解、 指針 vs 數組 記憶體結構一圖流、One More Thing:當二維數組遇見qsort()庫函數,關於比較函數cmp的迷思 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...