數據文件?

Odoo 是一個高度數據驅動的系統,模塊定義的一個重要部分是各種記錄的定義:UI(菜單和視圖)、安全性(訪問權限和記錄規則)、報告和普通數據都是通過記錄來定義的。

結構?

在Odoo中定義數據的主要方式是通過XML數據文件:XML數據文件的大體結構如下:

  • 根元素 odoo 內的任意數量操作元素

<?xml version="1.0" encoding="UTF-8"?>
<!-- the root elements of the data file -->
<odoo>
    <operation/>
    ...
</odoo>

數據文件按順序執行,操作只能引用先前定義操作的結果

注解

如果數據文件的內容只需要應用一次,您可以指定odoo標志 noupdate 設置為1。如果文件中的部分數據只需要應用一次,您可以將文件的這部分放置在<data noupdate=”1”>域中。

<odoo>
    <data noupdate="1">
        <!-- Only loaded when installing the module (odoo-bin -i module) -->
        <operation/>
    </data>

    <!-- (Re)Loaded at install and update (odoo-bin -i/-u) -->
    <operation/>
</odoo>

核心操作?

record?

record 適當地定義或更新數據庫記錄,它具有以下屬性:

model (必填)

要創建(或更新)的模型名稱

id

該記錄的 外部標識符 。強烈建議提供一個。

  • 對于記錄的創建,允許后續的定義修改或引用此記錄

  • 用于記錄修改,要修改的記錄

context

創建記錄時要使用的上下文

forcecreate

在更新模式下,如果記錄不存在,是否應該創建記錄

需要一個 外部ID ,默認為 True 。

field?

每個記錄都可以由“field”標簽組成,定義在創建記錄時要設置的值。沒有“field”的“record”將使用所有默認值(創建)或不執行任何操作(更新)。

field 必須有一個必填的 name 屬性,用于設置字段名稱,以及各種方法來定義值本身:

如果沒有為字段提供值,則該字段將隱式設置為“False”??捎糜谇宄侄位虮苊馐褂米侄蔚哪J值。

search

對于 關系字段 ,應該是字段模型上的 。

將評估域,使用它搜索字段的模型,并將搜索結果設置為字段的值。如果字段是 Many2one ,則僅使用第一個結果。

ref

如果提供了 ref 屬性,則其值必須是有效的 外部標識符 ,將查找并設置為字段的值。

主要用于 Many2oneReference 字段

type

如果提供了 type 屬性,則用于解釋和轉換字段的內容??梢酝ㄟ^ file 屬性或節點正文提供字段的內容。

可用類型為:

xml , html

field 的子元素提取為單個文檔,評估任何使用形式為 %(external_id)s外部 ID 。 %% 可用于輸出實際的 % 符號。

file

確保字段內容是當前模型中有效的文件路徑,將 module,path 作為字段值保存

char

直接將字段內容設置為字段的值,不進行修改

base64

將字段內容進行base64編碼,與 file 屬性結合使用,可將圖像數據加載到附件中

int

將字段的內容轉換為整數并將其設置為字段的值

float

將字段內容轉換為浮點數并將其設置為字段的值

list , tuple

應該包含任意數量的 value 元素,其屬性與 field 相同,每個元素都解析為生成的元組或列表的一個項,生成的集合設置為字段的值

eval

對于前面的方法不適用的情況, eval 屬性會簡單地評估提供的任何 Python 表達式,并將結果設置為字段的值。

評估上下文包含各種模塊( time , datetime , timedelta , relativedelta ),一個用于解析 外部標識符 的函數( ref )和當前字段的模型對象(如果適用)( obj

delete?

delete 標簽可以刪除之前定義的任意數量的記錄。它具有以下屬性:

model (必填)

應刪除指定記錄的模型

id

要刪除的記錄的 外部標識符

search

用于查找要刪除的模型記錄的 domain

idsearch 是互斥的

function?

function 標簽調用模型上的方法,并提供參數。它有兩個必需的參數 modelname ,分別指定要調用的模型和方法的名稱。

可以使用 eval (應該計算為要調用方法的參數序列)或 value 元素(請參見 list 值)來提供參數。

<odoo>
    <data noupdate="1">
        <record name="partner_1" model="res.partner">
            <field name="name">Odude</field>
        </record>

        <function model="res.partner" name="send_inscription_notice"
            eval="[[ref('partner_1'), ref('partner_2')]]"/>

        <function model="res.users" name="send_vip_inscription_notice">
            <function eval="[[('vip','=',True)]]" model="res.partner" name="search"/>
        </function>
    </data>

    <record id="model_form_view" model="ir.ui.view">
        ...
    </record>
</odoo>

快捷方式?

由于Odoo的一些重要結構模型比較復雜,數據文件提供了使用 記錄標簽 定義它們的更短的替代方案:

template?

創建一個 QWeb 視圖 ,只需要視圖的 arch 部分,并允許一些 可選 屬性:

id

視圖的 外部標識符

name , inherit_id , priority

ir.ui.view 上對應的字段相同(注意: inherit_id 應該是一個 外部標識符

primary

如果設置為 True 并與 inherit_id 結合使用,則將視圖定義為主要視圖

groups

逗號分隔的組 外部標識符 列表

page

如果設置為 "True" ,則該模板是一個網站頁面(可鏈接,可刪除)

optional

enableddisabled ,表示視圖是否可以在網站界面中禁用以及其默認狀態。如果未設置,則視圖始終處于啟用狀態。

CSV數據文件?

XML數據文件靈活且自我描述,但在批量創建相同模型的多個簡單記錄時非常冗長。

對于這種情況,數據文件也可以使用csv,這在 訪問權限 中經常出現:

  • 文件名為 model_name.csv

  • 第一行列出要寫入的字段,其中特殊字段 id 用于 外部標識符 (用于創建或更新)

  • 每行之后創建一個新記錄

以下是定義國家省份的數據文件 res.country.state.csv 的前幾行:

"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
state_au_5,au,"South Australia","SA"
state_au_6,au,"Tasmania","TAS"
state_au_7,au,"Victoria","VIC"
state_au_8,au,"Western Australia","WA"
state_us_1,us,"Alabama","AL"
state_us_2,us,"Alaska","AK"
state_us_3,us,"Arizona","AZ"
state_us_4,us,"Arkansas","AR"
state_us_5,us,"California","CA"
state_us_6,us,"Colorado","CO"

以更易讀的格式呈現:

編號

國家ID:標識符

名稱

代碼

state_au_1

au

澳大利亞首都領地

ACT

state_au_2

au

新南威爾士州

NSW

state_au_3

au

北領地

NT

state_au_4

au

昆士蘭州

QLD

state_au_5

au

南澳大利亞州

SA

state_au_6

au

塔斯馬尼亞州

TAS

state_au_7

au

維多利亞州

VIC

state_au_8

au

西澳大利亞州

WA

state_us_1

美國

阿拉巴馬州

AL

state_us_2

美國

阿拉斯加州

AK

state_us_3

美國

亞利桑那州

AZ

state_us_4

美國

阿肯色州

AR

state_us_5

美國

加利福尼亞州

加州

state_us_6

美國

科羅拉多州

CO

對于每一行(記錄):

  • 第一列是要創建或更新的記錄的 外部ID

  • 第二列是要鏈接到的國家對象的 外部ID (必須先定義國家對象)

  • 第三列是 res.country.statename 字段

  • 第四列是 res.country.statecode 字段