Odoo10開(kāi)發(fā)教程四(繼承和Domain)

繼承

模型繼承

Odoo提供兩種繼承機(jī)制,以模塊化方式擴(kuò)展現(xiàn)有模型。
第一種繼承機(jī)制允許一個(gè)模塊修改另一個(gè)模塊中定義的模型的行為荒叼。

  • 給模型添加字段
  • 覆蓋模型現(xiàn)有字段
  • 給模型添加約束
  • 給模型添加方法
  • 覆蓋模型現(xiàn)有方法

第二種繼承機(jī)制(委托)允許將模型的每條記錄鏈接到父模型的記錄缤削,并且提供對(duì)父記錄的透明訪問(wèn)瘦棋。

視圖繼承

Odoo不是通過(guò)覆蓋來(lái)修改現(xiàn)有視圖,而是通過(guò)視圖繼承鲜棠。子視圖不僅能夠修改繼承至父視圖的自身內(nèi)容肌厨,而且能夠修改和刪除父視圖中的內(nèi)容。
擴(kuò)展視圖使用inherit_id字段引用其父代豁陆,而不是單個(gè)視圖柑爸,其arch字段由任意數(shù)量的xpath元素組成,選擇和更改其父視圖的內(nèi)容:

<!-- improved idea categories list -->
<record id="idea_category_list2" model="ir.ui.view">
    <field name="name">id.category.list2</field>
    <field name="model">idea.category</field>
    <field name="inherit_id" ref="id_category_list"/>
    <field name="arch" type="xml">
        <!-- find field description and add the field
             idea_ids after it -->
        <xpath expr="http://field[@name='description']" position="after">
          <field name="idea_ids" string="Number of ideas"/>
        </xpath>
    </field>
</record>

expr
在父視圖中選者單個(gè)元素的XPath表達(dá)式盒音。如果沒(méi)有匹配到元素或者匹配到多個(gè)元素則引發(fā)錯(cuò)誤竖配。
position
對(duì)匹配到的元素進(jìn)行操作。
  inside
  在匹配元素的末尾追加
  before
  作為匹配元素的同級(jí)元素添加在其后面
  after
  作為匹配元素的同級(jí)元素添加在其前面
  replace
  替換匹配的元素
  attributes
  使用新的屬性替換匹配元素的屬性

提示
當(dāng)匹配單個(gè)元素時(shí)里逆,position可以直接在匹配的元素上設(shè)置屬性进胯。下面的兩個(gè)繼承將給出相同的結(jié)果:

<xpath expr="http://field[@name='description']" position="after">
    <field name="idea_ids" />
</xpath>

<field name="description" position="after">
    <field name="idea_ids" />
</field>

練習(xí)更改現(xiàn)有內(nèi)容

  • 使用模型繼承,修改現(xiàn)有partner模型原押,添加instructor布爾字段胁镐,以及對(duì)應(yīng)表示"授課-講師"關(guān)聯(lián)的many2many字段
  • 使用視圖繼承在partner的表單視圖中顯示這個(gè)字段

注意,這里是通過(guò)開(kāi)發(fā)人員模式來(lái)查找視圖外部ID并放置新字段的诸衔。

  • 創(chuàng)建文件openacademy/models/partner.py并將其導(dǎo)入__init__.py
  • 創(chuàng)建文件openacademy/views/partner.xml并將其添加到__manifest__.py

openacademy/__init__.py

# -*- coding: utf-8 -*-
from . import controllers
from . import models
from . import partner

openacademy/__manifest__.py

        # 'security/ir.model.access.csv',
        'templates.xml',
        'views/openacademy.xml',
        'views/partner.xml',
    ],
    # only loaded in demonstration mode
    'demo': [

openacademy/partner.py

# -*- coding: utf-8 -*-
from odoo import fields, models

class Partner(models.Model):
    _inherit = 'res.partner'

    # Add a new column to the res.partner model, by default partners are not
    # instructors
    instructor = fields.Boolean("Instructor", default=False)

    session_ids = fields.Many2many('openacademy.session',
        string="Attended Sessions", readonly=True)

openacademy/views/partner.xml

<?xml version="1.0" encoding="UTF-8"?>
 <odoo>
    <data>
        <!-- Add instructor field to existing view -->
        <record model="ir.ui.view" id="partner_instructor_form_view">
            <field name="name">partner.instructor</field>
            <field name="model">res.partner</field>
            <field name="inherit_id" ref="base.view_partner_form"/>
            <field name="arch" type="xml">
                <notebook position="inside">
                    <page string="Sessions">
                        <group>
                            <field name="instructor"/>
                            <field name="session_ids"/>
                        </group>
                    </page>
                </notebook>
            </field>
        </record>

        <record model="ir.actions.act_window" id="contact_list_action">
            <field name="name">Contacts</field>
            <field name="res_model">res.partner</field>
            <field name="view_mode">tree,form</field>
        </record>
        <menuitem id="configuration_menu" name="Configuration"
                  parent="main_openacademy_menu"/>
        <menuitem id="contact_menu" name="Contacts"
                  parent="configuration_menu"
                  action="contact_list_action"/>
    </data>
</odoo>

Domain

Odoo中盯漂,Domain代表記錄集的條件表達(dá)式。Domain是定義模型子集的一組規(guī)則笨农。每個(gè)規(guī)則是一個(gè)包含名稱就缆、操作和值的三元組。例如谒亦,下面是Product模型子集的Domain表達(dá)式竭宰,“單價(jià)大于1000且類型為服務(wù)”的記錄集:

[('product_type', '=', 'service'), ('unit_price', '>', 1000)]

多個(gè)規(guī)則組合時(shí)空郊,默認(rèn)條件組合方式是AND。邏輯運(yùn)算符&(AND),|(OR),!(NOT)可以用來(lái)顯示的組合多個(gè)規(guī)則切揭。它們?cè)谇熬Y位置使用(操作符在參數(shù)之前狞甚,而不是中間)。例如下面的Domain表達(dá)式廓旬,含義是"類型為服務(wù)或者單價(jià)不介于1000和2000之間"

['|',
    ('product_type', '=', 'service'),
    '!', '&',
        ('unit_price', '>=', 1000),
        ('unit_price', '<', 2000)]

當(dāng)在客戶端界面選擇記錄集時(shí)哼审,domain參數(shù)可以添加到關(guān)聯(lián)字段上,以限制只顯示有效的關(guān)聯(lián)字段孕豹。

練習(xí)在關(guān)聯(lián)字段上使用Domain涩盾,當(dāng)為授課選取講師時(shí),只有instructor值為True的講師會(huì)被顯示出來(lái)励背。

openacademy/models.py

    duration = fields.Float(digits=(6, 2), help="Duration in days")
    seats = fields.Integer(string="Number of seats")

    instructor_id = fields.Many2one('res.partner', string="Instructor",
        domain=[('instructor', '=', True)])
    course_id = fields.Many2one('openacademy.course',
        ondelete='cascade', string="Course", required=True)
    attendee_ids = fields.Many2many('res.partner', string="Attendees")

注意
聲明為文字列表的domain會(huì)在服務(wù)端進(jìn)行計(jì)算旁赊,不會(huì)出現(xiàn)在右側(cè)的動(dòng)態(tài)列表中,而聲明為字符串的domain是在客戶端進(jìn)行計(jì)算的椅野,字段名將出現(xiàn)在右側(cè)列表终畅。

練習(xí)更復(fù)雜的domain,創(chuàng)建新的partner類別Techer/Level1Techer/Level2.一個(gè)授課的教授人可以是講師或者任意級(jí)別的教師竟闪。

  • 修改Session模型的domain
  • 修改openacademy/view/partner.xml以獲得訪問(wèn)Partner類別的入口离福。

openacademy/models.py

    seats = fields.Integer(string="Number of seats")

    instructor_id = fields.Many2one('res.partner', string="Instructor",
        domain=['|', ('instructor', '=', True),
                     ('category_id.name', 'ilike', "Teacher")])
    course_id = fields.Many2one('openacademy.course',
        ondelete='cascade', string="Course", required=True)
    attendee_ids = fields.Many2many('res.partner', string="Attendees")

openacademy/views/partner.xml

        <menuitem id="contact_menu" name="Contacts"
                  parent="configuration_menu"
                  action="contact_list_action"/>

        <record model="ir.actions.act_window" id="contact_cat_list_action">
            <field name="name">Contact Tags</field>
            <field name="res_model">res.partner.category</field>
            <field name="view_mode">tree,form</field>
        </record>
        <menuitem id="contact_cat_menu" name="Contact Tags"
                  parent="configuration_menu"
                  action="contact_cat_list_action"/>

        <record model="res.partner.category" id="teacher1">
            <field name="name">Teacher / Level 1</field>
        </record>
        <record model="res.partner.category" id="teacher2">
            <field name="name">Teacher / Level 2</field>
        </record>
    </data>
</odoo>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炼蛤,隨后出現(xiàn)的幾起案子妖爷,更是在濱河造成了極大的恐慌,老刑警劉巖理朋,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件絮识,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嗽上,警方通過(guò)查閱死者的電腦和手機(jī)次舌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兽愤,“玉大人彼念,你說(shuō)我怎么就攤上這事∏诚簦” “怎么了逐沙?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)洼畅。 經(jīng)常有香客問(wèn)我吩案,道長(zhǎng),這世上最難降的妖魔是什么帝簇? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任徘郭,我火速辦了婚禮靠益,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崎岂。我一直安慰自己,他們只是感情好闪湾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布冲甘。 她就那樣靜靜地躺著,像睡著了一般途样。 火紅的嫁衣襯著肌膚如雪江醇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天何暇,我揣著相機(jī)與錄音陶夜,去河邊找鬼。 笑死裆站,一個(gè)胖子當(dāng)著我的面吹牛条辟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宏胯,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼羽嫡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肩袍?” 一聲冷哼從身側(cè)響起杭棵,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氛赐,沒(méi)想到半個(gè)月后魂爪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艰管,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年滓侍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲芋。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粗井,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街图,到底是詐尸還是另有隱情浇衬,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布餐济,位于F島的核電站耘擂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏絮姆。R本人自食惡果不足惜醉冤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一秩霍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚁阳,春花似錦铃绒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至定血,卻和暖如春赔癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澜沟。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工灾票, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茫虽。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓刊苍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親濒析。 傳聞我的和親對(duì)象是個(gè)殘疾皇子班缰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容