第四章:模型和基本字段?

上一章節 的結尾,我們成功創建了一個Odoo模塊。然而,此時它仍然是一個空殼,無法存儲任何數據。在我們的房地產模塊中,我們想要將與房產相關的信息(名稱、描述、價格、居住面積等)存儲在數據庫中。Odoo框架提供了工具來簡化數據庫交互。

在繼續練習之前,請確保已安裝 estate 模塊,即在應用程序列表中必須顯示為“已安裝”。

對象關系映射?

參考 : 有關此主題的文檔可以在 模型 API 中找到。

注解

目標 : 完成本節后,應創建表 estate_property :

$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------
    0
(1 row)

Odoo的一個關鍵組件是 ORM`_層。這一層避免了手動編寫大部分 `SQL,并提供了可擴展性和安全性服務2。

業務對象是聲明為擴展 Model 的Python類,將它們集成到自動持久性系統中。

模型可以通過在其定義中設置屬性來進行配置。最重要的屬性是: _name ,它是必需的,并定義了模型在Odoo系統中的名稱。這是一個模型的最小定義:

from odoo import models

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

這個定義足以讓ORM生成一個名為 test_model 的數據庫表。模型中的 . 會被ORM自動轉換為 _ 。按照慣例,所有的模型都位于 models 目錄中,每個模型都在自己的Python文件中定義。

看一下如何定義 crm_recurring_plan 表以及如何導入相應的Python文件:

  1. 該模型定義在文件 crm/models/crm_recurring_plan.py 中(參見 此處)

  2. 文件 crm_recurring_plan.py 被導入到 crm/models/__init__.py 中 (參見 這里)

  3. 文件夾 modelscrm/__init__.py 中被導入(參見 這里

Exercise

定義房地產屬性模型。

根據CRM模塊中給出的示例,為 estate_property 表創建適當的文件和文件夾。

創建文件后,為 estate.property 模型添加最小定義。

任何 Python 文件的修改都需要重新啟動 Odoo 服務器。當我們重新啟動服務器時,我們將添加參數 -d-u

$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate

-u estate 表示我們要升級 estate 模塊,即 ORM 將應用數據庫模式更改。在這種情況下,它會創建一個新表。 -d rd-demo 表示升級應該在 rd-demo 數據庫上執行。 -u 應始終與 -d 結合使用。

在啟動過程中,您應該會看到以下警告:

...
WARNING rd-demo odoo.models: The model estate.property has no _description
...
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...

如果是這種情況,那么你應該沒問題了!為了確保,可以像 目標 中演示的那樣,使用 psql 進行雙重檢查。

Exercise

添加描述。

在你的模型中添加一個 _description 來消除其中一個警告。

模型字段?

參考 : 有關此主題的文檔可以在 字段 API 中找到。

字段用于定義模型可以存儲什么以及它們存儲在哪里。字段在模型類中定義為屬性:

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 。

類型?

注解

目標 : 完成本節后,應向表 estate_property 添加了幾個基本字段:

$ psql -d rd-demo

rd-demo=# \d estate_property;
                                            Table "public.estate_property"
    Column       |            Type             | Collation | Nullable |                   Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
id                 | integer                     |           | not null | nextval('estate_property_id_seq'::regclass)
create_uid         | integer                     |           |          |
create_date        | timestamp without time zone |           |          |
write_uid          | integer                     |           |          |
write_date         | timestamp without time zone |           |          |
name               | character varying           |           |          |
description        | text                        |           |          |
postcode           | character varying           |           |          |
date_availability  | date                        |           |          |
expected_price     | double precision            |           |          |
selling_price      | double precision            |           |          |
bedrooms           | integer                     |           |          |
living_area        | integer                     |           |          |
facades            | integer                     |           |          |
garage             | boolean                     |           |          |
garden             | boolean                     |           |          |
garden_area        | integer                     |           |          |
garden_orientation | character varying           |           |          |
Indexes:
    "estate_property_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "estate_property_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
    "estate_property_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL

字段可以分為兩大類:’簡單字段’,即直接存儲在模型表中的原子值,和’關系字段’,它們鏈接同一模型或不同模型的記錄。

簡單字段示例包括: Boolean , Float , Char , Text , DateSelection 。

Exercise

向房地產物業表添加基本字段。

將以下基本字段添加到表中:

字段

類型

名稱

字符

描述

文本

郵政編碼

字符

可用日期

日期

期望價格

浮點數

銷售價格

浮點數

臥室數

整數

生活區域

整數

門面

整數

車庫

布爾值

花園

布爾值

花園面積

整數

花園方向

選擇

garden_orientation 字段必須有4個可能的值:’North’、’South’、’East’和’West’。選擇列表被定義為元組列表,參見 `這里<https://github.com/odoo/odoo/blob/b0e0035b585f976e912e97e7f95f66b525bc8e43/addons/crm/report/crm_activity_report.py#L31-L34>`__的示例。

當字段添加到模型中后,請使用 -u estate 選項重啟服務器

$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate

連接到 psql 并檢查表格 estate_property 的結構。您會注意到還添加了一些額外的字段。我們稍后會重新訪問它們。

常用屬性?

注解

目標 :本節結束時,表 estate_property 中的列 nameexpected_price 應為非空:

rd-demo=# \d estate_property;
                                            Table "public.estate_property"
    Column       |            Type             | Collation | Nullable |                   Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
...
name               | character varying           |           | not null |
...
expected_price     | double precision            |           | not null |
...

與模型本身類似,字段可以通過傳遞配置屬性作為參數進行配置:

name = fields.Char(required=True)

所有字段都有一些可用的屬性,以下是最常見的屬性:

stringstr ,默認值:字段名稱)

用戶界面中字段的標簽(用戶可見)。

requiredbool ,默認值: False

如果為“True”,則該字段不能為空。它必須具有默認值或在創建記錄時始終給定一個值。

helpstr ,默認值: ''

為用戶提供UI中的長形幫助工具提示。

indexbool ,默認值: False

請求Odoo在該列上創建一個 數據庫索引。

Exercise

為現有字段設置屬性。

添加以下屬性:

字段

屬性

名稱

必填

期望價格

必填

重啟服務器后,兩個字段都應該是非空的。

自動字段?

參考 : 有關此主題的文檔可以在 自動字段 中找到。

你可能已經注意到你的模型有一些你沒有定義的字段。Odoo 在所有模型中創建了一些字段1。這些字段由系統管理,不能被寫入,但如果有用或必要,它們可以被讀?。?/p>

id ( Id )

模型記錄的唯一標識符。

create_date ( Datetime )

記錄創建日期。

create_uid ( Many2one )

創建記錄的用戶。

write_date ( Datetime )

記錄的最后修改日期。

write_uid ( Many2one )

最后修改記錄的用戶。

現在我們已經創建了第一個模型,讓我們 添加一些安全性 !

1

可以 禁用某些字段的自動創建

2

編寫原始的 SQL 查詢是可能的,但需要謹慎,因為這將繞過所有 Odoo 的身份驗證和安全機制。