Python与odoo
谁选择了谁?初评价
Python的优点:高效处理数据、简单、优雅
odoo的优点:开源、高度封装、开发高效
个人认为 ERP不属于互联网,数据和访问相对较为封闭,web的性能要求不会太高,因此Python可以堪当这个任务。
Odoo是Python写的一个开源orp,是用Python写的框架。odoo全面面向对象化,从ORM到view 和权限规则等都是类、对象、属性和方法去实现业务。
入坑一个月的感受–odoo初体验
odoo玩的666需要完成以下几点:
- Python基础 推荐雪峰老师的Python --看到面向对象高级编程https://www.liaoxuefeng.com/wiki/1016959663602400
- odoo入门 学完了Python之后怎么写odoo–看这个小黄书 https://odoobook.tnk-studio.org/
- odoo项目 一个项目不过瘾 不过硬 再来一发 https://www.cnblogs.com/ljwTiey/p/11470897.html
- odoo官方文档 我觉得做两个小项目再看官方文档比较好 https://www.odoo.com/documentation/10.0/
- 其他 --相信自己的努力
要想进步就要读别人的代码–若读者不在项目中,推荐看odoo原生的应用;在项目上就看前辈们写的代码,虚心向他们请教。
记录并梳理一下知识点
odoo的技术核心现在看主要分为三块:model view security
model
常用方法
ORM中把每个class看成一张表由每个record(对象)组成,每个字段都是对象的属性,对象的各种方法就完成需求的各种业务处理。
- many2one 字段多对1,字段名_id
对象使用关联表的字段直接点一下就可以了 - one2many 字段多对1,字段名_ids
对象操作关联表的字段需要遍历后再操作 - many2many 字段多对多,字段名_ids
对象操作关联表的字段需要遍历后再操作
重点来了 多对多操作 必须掌握
CREATE = lambda values: (0, False, values) // 例:[(0, 0, new_ids)] 创建
UPDATE = lambda id, values: (1, id, values) // 例:[(1, old_id, new_id)] 更新一个已经存在的并且关联的值的数据
DELETE = lambda id: (2, id, False) // 例:[(2, old_id, False)] 删除数据但不断开链接
FORGET = lambda id: (3, id, False) // 例:[(3, old_id, False)] 断开链接但不删除数据
LINK_TO = lambda id: (4, id, False) // 例:[(4, old_id, False)] 链接 不可one2many
DELETE_ALL = lambda: (5, False, False) // 例:[(5, False, False)] 删除全部 不可one2many
REPLACE_WITH = lambda ids: (6, False, ids) // 例:[(6, False, new_ids)] 替换/更新(先5再4)
0创1更2删3忘4恋5干净=》0创1更2删,3忘4链5全,6替换,45不可one
现在有问题没有搞懂?!什么时候断开链接?什么时候需要加上链接呢?就是什么时候使用上面3和4的问题
view
view视图目前接触的有tree form kanban还有calendar search
view与action、menuitem的关系:视图展示需要action发生,action绑定在menuitem上触发
field中的一些属性要熟练应用: options widget attrs invisible groups domain eval ref 上面字段中的一些骚操作需要学习
security
业务中必须面对的是 用户组权限规则 分为三个维度
用户组 在用户设置时给用户归属与某些权限组
菜单 哪些菜单可以让某些用户组可用
动作 哪些动作可以让某些用户组可用
字段 哪些字段可以让某些用户组可看
ir.model.access.csv文件说明了哪些用户组可以有哪些权限(CURD)tips:用户组为空则使对任务和用户组
规则是用来细化修饰用户组,针对部分用户组有哪些具体权限:部分用户组用domain来筛选出来,规则直接字段给出如下:
<record id="crm_xxx_rule" model="ir.rule">
<field name="name">xxx用户组
</field>
<field name="model_id" ref="model_xxx"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups"
eval="[(4, ref('group_xxx_all'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
目前最大的感受:一定要多写代码,写多了发现并解决了问题才能让量变到质变