在這一篇教程中,將會涉及到外鍵字段,能夠將兩個模型關聯起來,而後很方便地獲取到對應的數據。python
這一小節裏,咱們會給待辦事項加上分類,而且這個分類可讓用戶本身建立維護。咱們須要先建立一個新的模型 TodoCategory
,而後將它和待辦事項關聯起來:git
# models.py class TodoCategory(models.Model): _name = 'todo.category' _description = '分類' name = fields.Char(u'名稱') task_ids = fields.One2many('todo.task', 'category_id', string=u'待辦事項') count = fields.Integer(u'任務數量', compute='_compute_task_count') @api.depends('task_ids') @api.multi def _compute_task_count(self): pass class TodoTask(models.Model): _name = 'todo.task' _description = '待辦事項' # ... category_id = fields.Many2one('todo.category', string=u'分類')
在上面的代碼中,咱們定義了一個 todo.category
模型,包含三個字段,而後添加了一個 category_id
到待辦事項模型中,咱們重點來看看 category_id
和 task_ids
這兩個字段。github
這兩個字段都是關聯字段,一個是 Many2one
,另外一個是 One2many
,還有一種咱們暫時不會講到的 Many2many
多對多的關聯字段。Many2one
有一個必填的屬性 comodel_name
表示要關聯的模型的 _name
,這個字段的值多是 0 個或 1 個所關聯對象的記錄集,咱們能夠經過這個字段直接獲取到所關聯的數據對象,而不須要本身去查找對應的實例。另外一個關聯字段 One2many
一樣有必填的屬性 comodel_name
,同時還有一個 inverse_name
屬性,表示的是與當前模型所關聯的模型(comodel_name 所指的模型)的 Many2one
字段的字段名,在此例中即 category_id
,經過 One2many
字段咱們能夠直接獲取到全部關聯了當前記錄的數據集。在這個例子中,假設咱們有一個分類是「工做」,也就是說咱們能夠經過工做這個分類的 task_ids
這個字段獲取到全部待辦事項中 category_id
所關聯的分類是「工做」的全部待辦事項。api
回到咱們的代碼中,咱們看到分類模型中還有一個計算字段 count
,咱們但願能夠看到在一個分類下有多少待辦事項,因此須要用到上一篇教程中所講到的計算字段,這裏就看成是複習,一塊兒來完成這個字段的計算邏輯:ui
# models.py @api.depends('task_ids') @api.multi def _compute_task_count(self): for record in self: record.count = len(record.task_ids)
這裏的邏輯也十分簡單,咱們只須要經過記錄集的實例對象 record
獲取到對應的待辦事項,而後用 len()
獲取 task_ids
的長度便可。spa
好的,模型已經有了,還差了點什麼呢?沒錯,還少了菜單和視圖,這裏咱們直接給出代碼,若是還有不理解怎麼建立菜單和視圖的小夥伴,記得翻看一下以前的教程內容。code
<!-- menus.xml --> <?xml version="1.0" encoding="utf-8"?> <odoo> <data> <!-- 主菜單定義 --> <menuitem id="menu_todo" name="Todo"/> <menuitem id="menu_todo_submenu" parent="menu_todo" name="待辦事項"/> <!-- 菜單動做定義 --> <record id="action_todo_task" model="ir.actions.act_window"> <field name="name">待辦事項</field> <field name="res_model">todo.task</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> <field name="target">current</field> </record> <record id="action_todo_category" model="ir.actions.act_window"> <field name="name">分類</field> <field name="res_model">todo.category</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> <field name="target">current</field> </record> <!-- 子菜單定義 --> <menuitem action="action_todo_category" id="submenu_todo_category" name="分類" parent="menu_todo_submenu" sequence="8"/> <menuitem action="action_todo_task" id="submenu_todo_task" name="待辦事項" parent="menu_todo_submenu" sequence="10"/> </data> </odoo>
菜單這裏咱們多增長了一層,聰明的大家應該可以一眼看出來哪裏不一樣了,若是仍是沒找到,實際運行以後再觀察一下菜單的結構吧~orm
<!-- views.xml --> <odoo> <data> <!-- ... --> <record id="todo_category_view_tree" model="ir.ui.view"> <field name="name">todo.category.view_tree</field> <field name="model">todo.category</field> <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Todo Category"> <field name="name"/> <field name="count"/> </tree> </field> </record> </data> </odoo>
OK,來更新一下模塊,而後打開看看效果吧,再嘗試建立幾個分類,而且給待辦事項關聯上分類。xml
一切看起來還不錯,可是有沒有以爲,建立待辦事項的表單視圖(Form View),以及分類的表單視圖,顯得有些凌亂了?雖然並非不能用,可是,咱們仍是決定要改造一下!對象
咱們先從分類的視圖開始,首先能夠看到分類中主要的信息就兩個——分類的名稱和分類下的任務數量。待辦事項咱們其實不須要從分類中直接去查看,因此咱們大可沒必要把待辦事項的記錄顯示出來,那咱們的目標已經很明確了,隱藏分類表單視圖中的待辦事項記錄,和 Tree View 同樣,咱們把視圖先寫好:
<!-- views.xml --> <record id="todo_category_view_form" model="ir.ui.view"> <field name="name">todo.category.view_form</field> <field name="model">todo.category</field> <field name="type">form</field> <field name="arch" type="xml"> <form string="Todo Category"> <sheet> <group> <group> <field name="name"/> </group> <group> <field name="count" readonly="True"/> </group> </group> </sheet> </form> </field> </record>
怎麼樣,看起來是否是舒服多了~再仔細一想,建立分類其實也只須要填一個名稱,能不能不須要跳轉到專門的表單視圖裏去建立咧?那固然是沒問題的啦,咱們可讓分類直接就在 Tree View 中建立而不須要專門到 Form View 中去:
<!-- views.xml --> <record id="todo_category_view_tree" model="ir.ui.view"> <field name="name">todo.category.view_tree</field> <field name="model">todo.category</field> <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Todo Category" editable="bottom"> <field name="name"/> <field name="count"/> </tree> </field> </record>
其實很簡單,咱們只須要在分類的 Tree View 中的 <tree />
標籤中加上 editable="bottom"
這個屬性便可,超簡單有沒有!分類的視圖的處理,咱們就先到這裏,再來看看待辦事項的表單視圖應該怎麼弄比較好。
待辦事項的表單視圖,咱們只須要簡單地排一下版就好啦,沒有複雜的處理:
<!-- views.xml --> <record id="todo_task_view_form" model="ir.ui.view"> <field name="name">todo.task.view_form</field> <field name="model">todo.task</field> <field name="type">form</field> <field name="arch" type="xml"> <form string="Todo"> <sheet> <group> <group> <field name="name"/> <field name="category_id"/> <field name="is_done"/> </group> <group> <field name="priority"/> <field name="deadline"/> <field name="is_expired" readonly="True"/> </group> </group> </sheet> </form> </field> </record>
視圖部分,就先到這裏,這還只是很基礎的一小部份內容,後面還會有更多關於視圖部分的特性,在咱們用到的時候將會給你們講解。
今天這篇教程的內容就先到這裏了,教程中的代碼會更新在個人 GitHub
倉庫中。
倉庫地址:Odoo-Tutorial-Demo