2015-10-06 81 views
2

我正在與Odoo 8合作,我試圖通過XML文件在數據庫中引入數據。如何通過XML文件在Odoo數據庫中引入Many2one字段值?

這個文件的內容是下一個:

<?xml version="1.0" encoding="utf-8"?> 
<openerp> 
    <data noupdate="1"> 
     <record id="event_invitation_email_template" model="email.template"> 
      <field name="name">Event Invitation</field> 
      <field name="subject">Invitation to an event</field> 
      <field name="email_from">${(object.event_id.user_id.email or &apos;[email protected]&apos;)|safe}</field> 
      <field name="email_to">${object.email|safe}</field> 
     </record> 
    </data> 
</openerp> 

這個偉大的工程。但是我想添加另一個字段model_id,這是一個Many2one(指向ir.model)。如果我想要設置的值具有XML ID,我會知道如何執行此操作,但事實並非如此。

我想設置模型my.new.model作爲model_id,但我不知道它的ID在數據庫中,如果我不做搜索。

所以我不知道如何管理我的目的。任何人都可以幫助我嗎?

回答

6

背景:

在通過安裝資源(模型,領域模型的記錄,視圖,記錄規則,動作,菜單項等)加載數據,Odoo寄存器映射記錄中的所有資源'ir_model_data'表('ir.model.data'對象),因此我們可以稍後引用這些記錄,甚至可以從其他模塊中引用這些記錄。在

映射記錄 'ir_model_data' 具有以下顯着的列:

  • 模塊:模塊名,字符串字面量(而不是它的id)
  • 模式:完全合格的點狀分離的對象名稱(也稱爲對象的技術名稱)
  • res_id:資源ID /數據庫ID(t中記錄的PK能夠在資源存儲)
  • 名稱:記錄名稱,字符串文字,在模塊名一起唯一標識記錄/資源

與模塊名稱形式一起記錄什麼名字我們知道資源外部ID具有以下完全限定的格式:'module_name.resource_name'

XML數據中定義的記錄通過'record'標籤的'id'屬性定義其外部ID。

'id'屬性可以明確包含'module_name'。 (完全合格的形式)或不。在後一種情況,假設(相對形式),聲明該資源的模塊:

以上長的故事被要求有下面的答案足夠的背景。

答:

在處理孩子的任何「記錄」標籤的「場」的標籤,在「裁判」的屬性,預計將有一個參考的現有記錄(完全限定或相對形式的外部ID ):

地圖ping記錄參考模型是在初始化模塊/模型/字段時創建的。因爲他們缺乏相應的XML記錄,並不能宣佈其對應的外部ID通過這種手段,ORM創建基於在「model_」前綴和其外部標識對象的技術名稱(用下劃線代替點):

這就是爲什麼記錄了參考模型(「ir.model」記錄)有以下形式:model_XXXXX

記錄一些其他的資源也已經知道前綴爲他們的外部ID:

模塊:https://github.com/odoo/odoo/blob/8.0/openerp/modules/db.py#L90

型號:https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L382

領域:https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L444

SELECT * FROM "ir_model_data" WHERE name LIKE 'module_%'; -- most are 'ir.module.module' records 
SELECT * FROM "ir_model_data" WHERE name LIKE 'model_%' ORDER by module, name; -- all/most are 'ir.model' records 
SELECT * FROM "ir_model_data" WHERE name LIKE 'field_%' ORDER BY module, name; -- all/most are 'ir.model.fields' records 

記錄的其他資源可以遵循一些約定或根本沒有:

SELECT * FROM "ir_model_data" WHERE name LIKE 'view_%' ORDER by module, name; -- all/most are 'ir.ui.view' records 
SELECT * FROM "ir_model_data" WHERE model LIKE 'ir.ui.view' AND name NOT LIKE 'view_%' ORDER by module, name; -- 'ir.ui.view' records with unconventional names 

所以你的情況,你要尋找的路線是:

<field name="model_id" eval="ref('your_module.model_my_new_model')"/> 
+0

這是一個偉大的答案@Jainik!我只會編輯它來添加我必須編寫的代碼行來管理我的目的。 – forvas

相關問題