网站搭建免费域名,网站开发需求文档范文,北京朝阳区居家办公,地方门户网站源码最近在odoo project模块的基础上做二开#xff0c;给task表加了一个版本字段version_id#xff0c;然后重写了 project表的Task_ids, 并且增加了一个domain#xff0c;结果折腾了大半天才搞定
写法1
这也是最初的写法#xff1a; version_id fields.Many2one(hx.p…最近在odoo project模块的基础上做二开给task表加了一个版本字段version_id然后重写了 project表的Task_ids, 并且增加了一个domain结果折腾了大半天才搞定
写法1
这也是最初的写法 version_id fields.Many2one(hx.prj.task.plan.version, 计划版本)task_ids fields.One2many(project.task, project_id, stringTasks,domain[(version_id, , version_id)])结果发现domain不起作用仔细阅读源代码 def get_domain_list(self, model): Return a list domain from the domain parameter. domain self.domainif callable(domain):domain domain(model)return domain if isinstance(domain, list) else []如果domain是字符串就返回空列表有点懵啊代码中有很多domain都是用引号括起来的 既然如此那就把引号去掉吧
写法2
不带引号 task_ids fields.One2many(project.task, project_id, stringTasks,domain[(version_id, , version_id)])这样写报错了
psycopg2.ProgrammingError: cant adapt type Many2one其实其他的One2Many字段我也不带引号是ok的。
写法3
实在没有办法了于是搜索odoo其他的one2many字段看看domain是怎么写的 发现两个事 1、one2many的domain确实是不带引号的 2、还有一种写法用lambda写一个匿名函数
website_message_ids fields.One2many(domainlambda self: [(model, , self._name), (message_type, in, [email, comment])])我尝试了一下这种写法 task_ids fields.One2many(project.task, project_id, stringTasks,domainlambda self:[(version_id, !, False),(version_id, , self.version_id.id)])这种写法可以引用self 很意外测试通过了。 仔细看上面的get_domain_list 函数domain 可以是一个函数
if callable(domain):domain domain(model)关于domain 要学习的地方还有很多特别是关系字段的domain更复杂一些。