1. Date类型字段给了默认值为当天但是创建的时候与实际时间相隔一天并不是时区的问题如下这张图片为2月10日创建默认值却是2月9日。解决方法将date 、datetime类型字段默认值分别写如下样式defaultlambda self: fields.Date.today() defaultlambda self: fields.Datetime.now()2.many2many字段保存后会自动排序导致后续生成的明细无法按照自己的意图来如下具体码数字段原来关联了8,9,10编辑然后添加1,2,3保存后该字段会自动排序又变成1,2,3,8,9,10此处应该是自动按照id来重排了给该字段的关联模型添加_order属性使之无序也尝试过了没用很多时候我们不需要这样的自动排序如我本想按照8,9,10,1,2,3的顺序遍历这个字段但是它自动排序后遍历的顺序就变了。解决方法新增加一个表里面有两个字段一个整数型记录顺序一个多对一关联具体码数。然后使销售这个表多对多这个新表就能将我们具体码数的选择顺序记录在这个新表中因为调用write方法时具体码数中的值还是按照我们选择的顺序来排的它在保存之后才会自动按id来排所以我们在write之前可以将这个顺序数据写进新表里之后遍历新表就可以了。3.kanban视图的继承上方红色框内必须为extension,否则无效元素标签的隐藏用上面两个方法均可4.跳转至向导后修改明细字段当一条明细某个字段值为空时该明细会直接删除原因工序字段设置了required1,这种字段编辑后未填向导模型并不会提示必填没填而是会直接删除掉此数据。解决方法删除掉此字段的required1后即可解决问题。5.将一个服务器的数据库复制到另外一个服务器上登录后出现白屏如下原因odoo数据库里面的一些静态数据或者附件会存在一个以该数据库命名的文件夹中当你移动、复制这个库到另外一个服务器上之后如果你把这个数据库的名称改掉它就会找不到这些静态文件查看日志会有以下错误提示解决方法复制的数据库名称保持和原来一样即可解决其他白屏问题现象备份出来的数据库在恢复到其他数据库上后登录odoo显示空白页非网络问题。刷新重启等方式都无法解决经查找资料发现是由于静态css文件是存储在数据库之外的数据库备份时静态文件和css文件不会一起备份所以当还原数据库后页面出现空白是由于静态文件路径是指定的但是本地又没有找不到导致的。解决方法DELETE FROM ir_attachment WHERE url LIKE /web/content/%;执行完毕后重启数据库服务以及odoo服务。重启服务升级base模块然后还可能存在模块图标消失的问题升级web模块6.当我们给一些系统基础表如res_partner,res_user,base这些表添加字段会出现无法重启的情况页面Internal Server Error 500后台提示res_partner没有某某字段(还没升级当然没有你倒是给我个升级的机会啊在pycharm的启动器里添加-u 模块名也没法解决)。解决方法a.新创建一个模块将继承写到这个单独的模块里面然后安装即可。此方法缺点下次再需要在这个表添加新字段还得新建模块。b.直接去数据库找到这个表给该表直接插入字段简单粗暴sql语句ALTER TABLE table-name ADD COLUMN cloumn-name varchar;table-name为表名cloumn-name为字段名, varchar为字段类型(根据实际需求来)插入完成后再重启服务就不会报错了。c.在模型里添加以下代码升级完记得注释掉否则很影响速度def __init__(self, pool, cr): init_res super().__init__(pool, cr) cr.execute(SELECT column_name FROM information_schema.columns WHERE table_name res_users -- 假设表在 public schema 中 ) reslist(map(lambda item:item[0],cr.fetchall())) if default_scan_workcenter_id not in res: cr.execute(ALTER TABLE res_users ADD COLUMN default_scan_workcenter_id varchar;) if default_scan_print_id not in res: cr.execute(ALTER TABLE res_users ADD COLUMN default_scan_print_id varchar;) if default_scan_gen_qty not in res: cr.execute(ALTER TABLE res_users ADD COLUMN default_scan_gen_qty numeric;) return init_res重启就不会报错了就可以正常升级d.重启完项目不要刷新页面切记直接去升级模块就行这个是最方便的方法前提是你重启后还没刷新页面。7.tree视图字段添加装饰器atrrs{invisible:[(state, in, (done, cancel))]}时字段会隐藏值而不是隐藏整个字段如果添加invisible1则是隐藏字段如下8.不可空继承。我在模块升级报错提示如下提示为某个xml文件上的视图出错一开始以为是那个xml文件里多了个字符或者少了个字符啥的然后仔细检查了那个xml文件好几遍也没有发现然后进断点发现不是这个xml的问题而是另外一个继承于此xml视图的问题。原因不可空继承。继承视图后一定得写一些东西而不是只继承不写如下。9.docker-compose启动报错windows上用docker-compose拉容器报错提示如下解决方法10.数据库迁移问题解决方案问题5的扩展当出现白屏或者以下错误时原因某某css加载失败因为数据库迁移以后ir_attachment表中存储的静态文件路径仍然是原路径新环境中查找不到然后就会报错解决方法删除ir_attachment表中的url字段以/web/content开头的所有数据delete from ir_attachment where url ilike /web/content/%;然后升级base模块问题解决还可以再地址上加上 debugassets然后就能进去了但是一关掉这个模式还是会白屏还是得执行上面的把静态文件删除。12.odoo域search里面的domain,sale_ids是many2many字段sale是单个单据此时使用in也是可以的可以匹配到sale_ids包含sale的。13.点按钮弹出来的targetnew页面无法中的tree无法按照模型的_order属性或者tree视图上的default_order属性排序需要手动排序后返回14.计算方法和onchange方法里面尽量不上调用unlink()调用后之前给表单赋值的操作会失效尽可能其他等效果的方式来实现删除功能unlink()应当在赋值之前进行如果先赋值后执行unlink,则赋值会失效如self.qty 10self.partner_id.unlink()则删除执行完成之后self.qty并不等于10而是变成015.模型one2many自己_parent_name location_id给类添加此属性类就可以one2many自己具体可参考源生stock.location模型16.browse方法即使数据id不存在也不会报错或者提示比如 product_id self.env[product.product].browse(111111)即使这个id 111111不存在这行代码也不会有问题而且还能用他来个其他字段赋值如self.product_id product_id.id当然赋值完成后会报错因为压根不存在这个id的产品所以这个方法的使用最好搭配上exists方法如下if not order_id.exists():raise UserError(产品不存在!)17.docker容器down掉重新up后odoo服务一直报错KeyError: ir.httpdown掉服务后重新up可能会报这个错误这时需要将docker-compose里面的数据卷和服务名称改一下由odoonetwork80 改成odoonetwork81可能原因服务重启拉起以后由于原来的networks已被占用所以这里重新建一个就不会报错了18.compute字段没加storeTrue也无法进页面自动计算。开始找了各种原因最后发现是因为字段设置了company_dependentTrue导致无法运算将company_dependent改成False即可19.odoo新添加的css样式升级以后没有加载成功刷新重启都没有效果。解决方法 ctrlF5 加载后台资源刷新不同于直接F5刷新20.self.env.ref(#视图id) 这种方式读取视图数据会用到 ir.ui.view这个模型的read权限当用户没有这个权限但进行的操作里面有涉及到读视图的这个方法就会引发权限错误报错如下解决方法a.给予该用户此权限b.方法开始之前先加上以下代码意思是超级用户执行逻辑self self.with_user(self.env.user).sudo()21.给二进制文件添加显示名称普通二进制字段添加上传文件后保存后会显示为 ‘xxx kb千字节’ 字样想要显示文件名称需要如下操作一定要记得加force_save122.向导模型onchange方法使用问题。问题场景点击按钮弹出向导模型有明细需要写的逻辑是在表头填写一个数字按序将所填数值填充到明细上的数量字段上大概样式如下开始写的逻辑是点按钮创建多条向导明细数据然后return跳转到该向导窗口new然后填写表头的数字自动填充下面明细结果发现明细填充不了页面上数值没变或者后台读取的数据没变force_save1也加了还是无济于事。解决方法点按钮不直接创建多条向导明细数据而是用默认值形式如下然后问题得到解决数据可以填充23.导入模板表单数据导入的时候默认是没有模板的如果想要自己提供模板在该模型下添加以下方法24.数字类型的字段Float,Integer,Monetary如果不加default0.0的话页面上会显示为0但数据库中默认为空并不是0。当我们筛选某个字段为0时会筛选不到这些单据需要筛选某个字段为未设置所以一般情况下这些类型的字段最好添加default0。25.需求动态创建tree视图字段点击菜单出现选择日期范围的弹窗选择日期后先删除之前的自定义字段然后根据日期范围按每天生成以x_开头的自定义字段按序添加到视图中去。错误按需求完成后会报错例如AttributeError: Char object has no attribute depends样式。引发问题的原因进过断点排查最后发现是字段缓存造成的问题随意创建和删除自定义字段会影响缓存的正确读取导致报错甚至系统崩溃。解决建议将临时创建自定义字段改成类中定义固定数量的字段加载视图之前更改这些字段element的string属性以达到相同效果或者做定时任务删除自定义字段而不是进页面时删除字段猜测没实践过。26.跳转向导弹窗时会触发明细如果明细是多对多字段且关联的不是向导模型上的计算字段的计算方法无论该计算方法是否添加storeTrue。27.销售单确认报错如下错误原因客户选择了本公司导致产品补货路线出错。解决方法可以在销售单确认前判断客户是否为本公司。28.onchange方法的赋值会触发计算方法但是计算方法的赋值不会触发onchange。29.附件权限问题报错如下这种一般都是附件上传时模型标识res_id和资源模型res_model没有正确的传值导致无法确认附件所属表单读的时候引发权限问题。解决方法去附件中将res_id和res_model值不全的附件删除后重新上传。30.报错如下原因猜测某些字段修改了字段类型导致数据库中的约束出现问题解决方法升级对应修改了字段类型的模块或者升级base.31.Monetory类型字段在列表视图上加sum合计必须保证币种字段也在视图中隐藏也行才会触发合计效果没加会是下图情况。另外如果列表视图多条数据币种不一致合计也不会显示。32.depends装饰器中的参数也需要避免递归否则将会导致模块升级异常例如像api.depends(product_Id.move_ids.product_id) 这种写法。33.one2many字段过滤需求场景查看生产单时只想查看部分工单问题如果在视图上过滤是没有作用的one2many字段在视图上加domain没有效果也考虑过加个many2many字段来关联这一部分想要查看工单但是many2many字段在视图上无法限制create和delete所以也是不行的。处理方法重新定义一个one2many字段如下route_workorder_ids fields.One2many(mrp.workorder, production_id, string工序关联工单, domain[(whether_report, , True)])domain的定义必须加在这里。到时候查看就用这个字段而不是workorder_ids即可34.给模型添加_sql_constraints限制时会弹出技术性错误如下这对用户肯定是不友好的。解决方法将_sql_constraints定义到字段之后而不是在字段定义之前定义移动位置即可如下补充上面问题如果还没解决就再升级一下模块不知道是不是odoo的bug有时候行有时候不行不行的时候就升级一下模块以上基于odoo1735.恢复数据库恢复常见错误。a.转一会儿圈然后直接没反应了也没有恢复好b.弹出以下提示常见排查原因修改http.py文件中如下配置参数排查nginx配置文件中的文件大小限制参数 client_max_body_size36.odoo模块升级报错KeyError: web.customize.report.import.wizard这个表原来有后来删掉了解决方法数据库执行一下sqlDELETE FROM ir_model_data WHERE module模块名称 AND nameweb.customize.report.import.wizard; DELETE FROM ir_model WHERE modelweb.customize.report.import.wizard;37.odoo模块升级报错如下报错原因many2many字段定义表名时定义了重复的表名可能之前定义过后来删了但是仍然会有记录解决方法给新的many2many字段换一个中间表表名38.bom不要批量创建速度极慢还会引发递归上限错误尽量遍历创建。39.image类型字段图片上传后会被压缩这和图片内存大小无关和图片的分辨率有关odoo17默认会将分辨率超过1920的图片压缩至1920例如3840x1000会被等比压缩至1920x5001000x3840则会被压缩至500x1920。要想不压缩图片分辨率在系统参数菜单下添加如下配置还有一点需要注意image类型字段命名尽可能不要命名为image_1920、image_128这样。