11.在__mainfest__.py中,要在depends中写上所依赖的模块名,在data中写上用到视图文件的名字,比如在views中有work.xml文件,在data中写上'views/work.xml'
12.对于Many2many字段,如果对于这个字段里的某个属性进行修改,升级以后,如果数据库里没有更新,则需要对这个模块进行卸载重装
13,对于Many2many字段的后台处理规则:
# (0, 0, { values }) 创建从表记录
例如:self.write({'order_line':[(0,0,{'name':'tfs','age':26})]})
# (1, ID, { values }) 更新从表记录
# (2, ID)删除从表中记录
# (3, ID)删除从表链接,但不删除从表记录
# (4, ID)链接一个现有的id记录
# (5,) 删除所有的链接,但不删除从表记录
# (6, 0, [IDs])替换,把原有的链接删掉,然后重新获取设置新的链接
比如给many2many链接一个model,首先将其放在一个list中,如[(4,model.id)],然后赋给这个many2many字段就可以了:
如果是创建,data[A] = [(4,model.id)],B.create(data)
如果是赋值,list = [(4,model.id)],B.A=list,A代表many2many字段
14.执行sql语句,目前是self.env.cr.execute(sql)
15.继承父类方法,在方法内第一行写super(子类类名,self),后面写具体的执行逻辑,意味着对父类方法的拓展,在执行完父类方法后,再执行子类中对父类方法的拓展
16.def create(self, vals)重写创建方法,vals以字典形式存储一些信息,
line = super(workcenter_productivity_sub, self).create(vals) 调用父类create方法
17.self.env['mrp.workorder']获取类mrp.workorder的实例对象,相当于workorder=mrp.workorder()
18.browse方法:浏览对象及其关联对象。从数据库中读取指定的记录,并生成对象返回。和read等方法不同,本方法不是返回简单的记录,而是返回对象。返回的对象可以直接使用"."存取对象的字段和方法,形如"object.name_of_the_field",关联字段(many2one等),也可以通过关联字段直接访问“相邻”对象。如:
class mrp.workcenter.productivity(model.Model):
self.env['mrp.workorder'].browse(vals.get('workorder_id')).workcenter_id.id
使用类mrp.workorder调用browse方法获取数据库中本model类(指mrp.workcenter.productivity)中的字段为workorder_id的对象,然后再用这个对象用‘ . ’来获取我们想要的字段id
19.继承父类方法,对其进行拓展之后,查看一下继承的父类方法是否有返回值,或者说有某个方法调用父类接收返回值,其实主要就看父类是否有返回值,如果有的话,继承父类的子方法如果只是对其中的数据库进行修改,而不是修改返回值的数据格式,那么只需要在前面写的super方法前,用一个对象来接收super的返回值,意味着接收父类执行完的返回值,然后在子方法最后返回这个值,如res = super(MrpProduction_sub,self)._workorders_create(bom, bom_data),否则会出现特殊的错误,TypeError: Mixing apples and oranges: mrp.workorder().concat(None)
20.self.operation_ids.ids代表获取当前对象关联表的所有id
21.对于@api.constrains,def _check(self),应该要先遍历self,防止先有数据,再安装模块,然后走到这个方法时,self是多个;还有就是子表内有这个方法,在父表内直接创建多条子表明细,那么self也是多个,不遍历的话会报错的,其实对于后面这种情况也可以通过在子表内写create方法,不做任何处理,然后就是相当于创建的时候,每创建一条就走一次constrains方法,self就是单个。