当前位置:首页>python>中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 8.费用信息

中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 8.费用信息

  • 2026-10-11 08:33:43
中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 8.费用信息
原始需求:

上班时间:

7:00:00

每节课小时数:

3

下班时间:

23:00:00

教练员每课时工资:

50

每小时收费(自):

80

每小时收费(手):

100

每小时收费(自驾):

60

新增数据模型

models目录新建system_info.py数据模型文件,代码如下:
# -*- coding: utf-8 -*-from odoo import fields, models, apiclass SystemInfo(models.Model):    _name = "nebula.system.info"    _description = "公司费用"    _order = 'name'    active = fields.Boolean('是否启用', default=True)    name = fields.Char('费用名称', size=30, index=True)    start_time = fields.Float('上班时间', default=0.0, digits=(4, 2))    end_time = fields.Float('下班时间', default=0.0, digits=(4, 2))    hours_hour = fields.Integer('每节课小时数', default=3)    wager_hour = fields.Integer('每小时工资', default=50)    note = fields.Text('备注')    order_line = fields.One2many('nebula.charge.line', 'order_id',                                 string='每小时费用', auto_join=True)    _sql_constraints = [('check_uniq_name', 'unique(name)', '不允许费用名称同名')]class ChargeLine(models.Model):    _name = 'nebula.charge.line'    _description = '费用明细'    @api.model    def _select_auto_type(self):        records = self.env['nebula.auto.type'].search([])        return [(r.name, r.name_type) for r in records]    name = fields.Selection(selection='_select_auto_type',                            required=True, string='排档类')    charge_hour = fields.Integer('每小时收费', default=70)    order_id = fields.Many2one('nebula.system.info', string='费用明细行', required=True,                               ondelete='cascade', index=True, copy=False)

这是一个主从表,下面是一些参数说明:   
ondelete='cascade':主表删除,明细表也删除。
copy=False:复制的时候,明细行不复制
auto_join=True:允许ORM在数据查询是使用SQL的join(拼接,级联)功能。如果使用它,那么访问权限规则将被忽略,并且权限规则不允许访问的关联记录,用户也可以访问,因此这种情况下的SQL查询将会更快更高效。
order_line = fields.One2many('nebula.charge.line', 'order_id', string='每小时费用', auto_join=True)
order_id = fields.Many2one('nebula.system.info', string='费用明细行', required=True, ondelete='cascade', index=True, copy=True)    order_line和order_id成对出现。
主表字段必须有order_line字段,One2Many表示一对多,多表是 nebula.charge.line。
明细表必须有order_id字段。Many2one表示多对一,对应唯一表是nebula.system.info。
将该文件名添加到models目录下__init__.py文件中,之前已经有演示。

设置访问权限

在security目录下的ir.model.access.csv新增两行权限记录。
access_nebula_system_info,nebula.system.info,model_nebula_system_info,group_peijia_manager,1,1,1,1access_nebula_charge_line,nebula.charge.line,model_nebula_charge_line,group_peijia_manager,1,1,1,1

创建视图层

在views目录新增system_info_views.xml文件,先用默认方式展示即可,待模块加载成功后再逐步修改和完善文件,内容如下:
<?xml version="1.0" encoding="utf-8"?><odoo>    <act_windowid="peijia.action_system_info_views"name="公司费用信息"    res_model="nebula.system.info" view_mode="tree,form" /></odoo>
修改peijia目录下__manifest__.py文件中data段,在views/car_type_views.xml前新增views/system_info_views.xml文件名。
在views目录下car_views.xml文件,前高级资料下的三级菜单位置添加菜单指向公司费用子模块,代码:
<  menuitemid="menu_system_info_views"name="公司费用信息"    parent="menu_peijia_adv_data"sequence="120"    action="peijia.action_system_info_views"/>
截图:
重启后,更新陪驾模块,查看是否已经有相关菜单和界面。这个子模块有主从表,所以需要大量改动,让我们继续修改视图层。

几个概念讲解

主从表:简单解释,一个学校有很多班级,每个班级有很多学生。
班级表(主表):班级号是主键,有班级号、班级名称、班级信息等。
学员表(主表):学员学号是主键,有学员学号、姓名、年龄、性别等信息。
排名表(从表):学生学号+班级号是主键,每个学生在每个班有班级排名。学生学号和班级号在排名表中被称为外键。
主键:是由一个或一组字段组成,这些字段的值对每条记录来说必须是唯一的。每张表必须由一个主键,并且主键值不能为空。
外键:如果表中的一个字段是另一个表的主键字段,那么这个字段在本表中被称为外键。

完善视图层

将system_info_views.xml文件中act_window段删除,修改如下:
<?xml version="1.0" encoding="utf-8"?><odoo>    <data>        <recordmodel="ir.ui.view"id="peijia.form_system_info_views">            <fieldname="name">peijia.system.info.form</field>            <fieldname="model">nebula.system.info</field>            <fieldname="arch"type="xml">                <formstring="表单">                    <sheet>                        <divclass="oe_button_box"name="button_box"/>                        <groupname="group_top">                            <groupname="group_left">                                <fieldname="active"/>                                <fieldname="name"/>                                <fieldname="start_time"widget="float_time"/>                                <fieldname="end_time"widget="float_time"/>                            </group>                            <groupname="group_right">                                <fieldname="hours_hour"/>                                <fieldname="wager_hour"/>                                <fieldname="note"/>                            </group>                        </group>                        <notebookcolspan="4">                                <pagestring="费用明细"name="order_lines"autofocus="autofocus">                                    <formstring="费用明细">                                        <sheet>                                            <fieldname="order_line"colspan="4"nolabel="1"/>                                        </sheet>                                    </form>                                </page>                        </notebook>                    </sheet>                </form>            </field>        </record>        <recordmodel="ir.ui.view"id="peijia.tree_system_info_views">            <fieldname="name">peijia.system.info.tree</field>            <fieldname="model">nebula.system.info</field>            <fieldname="priority">1</field>            <fieldname="arch"type="xml">                <treestring="列表">                    <fieldname="active"/>                    <fieldname="name"/>                    <fieldname="note"/>                </tree>            </field>        </record>        <recordmodel="ir.actions.act_window"id="peijia.action_system_info_views">            <fieldname="name">公司费用</field>            <fieldname="res_model">nebula.system.info</field>            <fieldname="view_mode">tree,form</field>        </record>    </data></odoo>
另外为子表在views目录下新建视图文件system_info_lines_views.xml,并将该文件名添加到__manifest__.py的data段里面。

代码如下:

<?xml version="1.0" encoding="utf-8"?><odoo>    <data>        <recordmodel="ir.ui.view"id="peijia.form_charge_line_views">            <fieldname="name">peijia.charge.lines.form</field>            <fieldname="model">nebula.charge.line</field>            <fieldname="arch"type="xml">                <formstring="表单">                    <sheet>                        <divclass="oe_button_box"name="button_box"/>                        <group>                            <fieldname="name"/>                            <fieldname="charge_hour"/>                        </group>                    </sheet>                </form>            </field>        </record>        <recordmodel="ir.ui.view"id="peijia.tree_charge_line_views">            <fieldname="name">peijia.charge.lines.tree</field>            <fieldname="model">nebula.charge.line</field>            <fieldname="priority">1</field>            <fieldname="arch"type="xml">                <treestring="列表">                    <fieldname="name"/>                    <fieldname="charge_hour"/>                </tree>            </field>        </record>        <recordmodel="ir.actions.act_window"id="peijia.action_charge_line_views">            <fieldname="name">公司费用</field>            <fieldname="res_model">nebula.charge.line</field>            <fieldname="view_mode">tree,form</field>        </record>    </data></odoo>
__manifest__.py文件data段截图如下:

界面展示

列表效果:
表单效果:

最新文章

随机文章