odoo字段继承改写类型报错问题

本文基于13.0

由于开发需要,想要把hr模块中的address_home_id改成文本类型,本来以为很简单的事情,很快码好了代码,但是却发现后台报错了,直接导致了系统进入不了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/modules/registry.py", line 85, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/modules/loading.py", line 416, in load_modules
force, status, report, loaded_modules, update_module, models_to_check)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/modules/loading.py", line 312, in load_marked_modules
perform_checks=perform_checks, models_to_check=models_to_check
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/modules/loading.py", line 194, in load_module_graph
registry.setup_models(cr)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/modules/registry.py", line 247, in setup_models
model._setup_fields()
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/models.py", line 2684, in _setup_fields
field.setup_full(self)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/fields.py", line 420, in setup_full
self._setup_related_full(model)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/fields.py", line 476, in _setup_related_full
field.setup_full(target)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/fields.py", line 420, in setup_full
self._setup_related_full(model)
File "/mnt/hgfs/codes/odoo/odoo-13.0/odoo/fields.py", line 475, in _setup_related_full
field = target._fields[name]
AttributeError: 'bool' object has no attribute '_fields'

本来一度以为是13.0又变更了API,不支持通过继承的方式改变字段的类型了,后来google也没发现类似的错误,于是只跟踪debug。

1
2
3
4
5
6
7
8
9
10
11
12
13
def _setup_related_full(self, model):
""" Setup the attributes of a related field. """
# fix the type of self.related if necessary
if isinstance(self.related, str):
self.related = tuple(self.related.split('.'))

# determine the chain of fields, and make sure they are all set up
target = model
for name in self.related:
field = target._fields[name]
field.setup_full(target)
target = target[name]
...

输出日志发现

1
2
3
4
5
6
7
8
9
10
---------
mobile_phone hr.employee()
---------
employee_id res.users()
---------
phone hr.employee()
---------
address_home_id hr.employee()
---------
phone False

在setup addreess_home_id字段之后,又去setup了phone,这就有点微妙了。

后来,突然想到,address_home_id肯定是被别的字段做了关联引用,从而导致了一旦变更了本字段的类型,会导致之前代码中关联的字段不能正确挂载而导致报错。

你的支持我的动力