odoo11.0模块开发流程(一)
运行odoo
事先把各种依赖项安装好(最好装在虚拟环境中,不要装在系统里),跑起来后我们再去探究模块的定义。
- PyCharm软件对着odoo-bin文件 run一遍,就可以跑起来了。
或者命令行也可以(命令同时在运行的时候,也提供了很多额外设置的参数)
python3 odoo-bin
1.-d <database>, --database <database> # 数据库在安装或更新模块时使用。 2.-i <modules>, --init <modules> # 运行服务器前要安装的模块,如果多个则逗号分隔列表,要跟-d 命令一起使用,因为需要数据库 3.-u <modules>, --update <modules> #运行服务器前要更新的模块,如果多个则逗号分隔列表,要跟-d 命令一起使用,因为需要数据库 4.--addons-path <directories> # 添加模块的路径
自定义模块
odoo-bin里面包含很多script插件命令,它提供了很多方便运行的命令,创建模块也是其中一个。因为odoo模块的规格不同于python模块,有着自己的要求,如果按着标准来手动建立也可以,可是有点繁琐,所以就应该是提供了快捷方式创建
创建模块
python3 odoo-bin scaffold <module name> <where to put it>
为odoo添加一个addons path,使他能够找到我们的模块
在odoo-bin文件里设置
#!/usr/bin/env python3 # set server timezone in UTC before time module imported __import__('os').environ['TZ'] = 'UTC' import odoo,sys if __name__ == "__main__": # 添加一下自定义模块的路径,让odoo知道需要搜索哪里,我这里是强制添加,懒得设置了 odoo.modules.module.ad_paths.append(sys.path[0]+'/myaddons') odoo.cli.main()
设置__manifest__.py文件
默认的用命令创建好后,都有默认的一些设置,我们把需要改的设置一下就好了
# -*- coding: utf-8 -*- { 'name': "请假", # 模块的名称 'summary': """ 员工请假单""", # 模块的摘要 'description': """ 方便员工填写请假单 """, # 模块用途的描述 'author': "Pocket", # 模块编写作者 'website': "http://www.baidu.com", # 模块相关网址 # 类别可用于筛选模块清单中的模块 'category': '工具/员工应用', # 模块类别 'version': '1.0.0', # 模块版本号 # 此模块要正常工作所需的任何模块 'depends': ['base'], # 模块的依赖项列表,默认至少一个base # 始终加载 'data': [ # 'security/ir.model.access.csv', 'views/views.xml', 'views/templates.xml', ], # 仅在演示模式中加载 'demo': [ 'demo/demo.xml', ], 'auto_install': False, # 不要自动安装该模块 'application': True, # 表示该模块是一个应用 }
更新应用列表
如果有新模块的增加,需要更新一遍,才能搜索出来,如果应用里没有更新应用列表功能,说明没有开启开发者模式,去设置里开启激活一下就好了。这时候再去搜索应该就能看到你自己定义的模块了。
编写数据模型
odoo中的数据模型使用python类来编写,继承自odoo 的 models.Model模块
声明好后会跟postgreSQL数据库进行ORM映射关系,当模块被安装,编写的数据模型会让postgreSQL去自动创建对应的数据表结构。
# -*- coding: utf-8 -*- from odoo import models, fields, api ''' 在模块安装完成后,odoo的ORM框架会自动把这个对象映射到数据库表 属性类型会映射到表字段数据类型,表名是模块名_对象名, 比如这个对象对应的表名是qingjia_qingjiadan,我们可以去postgreSQL里查看到 ''' class qingjia(models.Model): _name = 'qingjia.qingjiadan' # qingjia.qingjiadan对应在qsql中就是qingjia_qingjiadan,命名规则是这样的,我们必须严格遵守 name = fields.Char(string='申请人') # name是字段,string定义的申请人是显示在view上的 days = fields.Integer(string='天数') startdate = fields.Date(string='开始日期') reason = fields.Text(string='请假事由') # value2 = fields.Float(compute="_value_pc", store=True) # @api.depends('value') # def _value_pc(self): # self.value2 = float(self.value) / 100