diff options
| author | Raphael Collet <rco@odoo.com> | 2019-04-18 15:19:02 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2019-04-30 07:54:49 +0000 |
| commit | 63bc6013ab30acfee7fdedcd396ad3984543b99e (patch) | |
| tree | 0ec0a0d92b8c87d8eff2313a9a2c8e87c844d4ae | |
| parent | 0d21735a92c8d0b60babaac6d62dbc8eda7c11ea (diff) | |
[IMP] fields: relational fields automatically behave as mapped
In other words, `recs.foo_id == recs.mapped('foo_id')`.
| -rw-r--r-- | odoo/addons/base/tests/test_api.py | 8 | ||||
| -rw-r--r-- | odoo/fields.py | 11 |
2 files changed, 17 insertions, 2 deletions
diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py index 663b2f15312..57a33fc3e45 100644 --- a/odoo/addons/base/tests/test_api.py +++ b/odoo/addons/base/tests/test_api.py @@ -491,11 +491,13 @@ class TestAPI(common.TransactionCase): """ Check map on recordsets. """ ps = self.env['res.partner'].search([]) parents = ps.browse() - for p in ps: parents |= p.parent_id + for p in ps: + parents |= p.parent_id # map a single field self.assertEqual(ps.mapped(lambda p: p.parent_id), parents) self.assertEqual(ps.mapped('parent_id'), parents) + self.assertEqual(ps.parent_id, parents) # map a sequence of fields self.assertEqual( @@ -506,6 +508,10 @@ class TestAPI(common.TransactionCase): ps.mapped('parent_id.name'), [p.name for p in parents] ) + self.assertEqual( + ps.parent_id.mapped('name'), + [p.name for p in parents] + ) # map an empty sequence of fields self.assertEqual(ps.mapped(''), ps) diff --git a/odoo/fields.py b/odoo/fields.py index 5d0cf903232..6017f12f271 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -989,7 +989,7 @@ class Field(MetaField('DummyField', (object,), {})): if record is None: return self # the field is accessed through the owner class - if record: + if record._ids: # only a single record may be accessed record.ensure_one() try: @@ -2033,6 +2033,15 @@ class _Relational(Field): 'context': {}, # context for searching values } + def __get__(self, records, owner): + # base case: do the regular access + if records is None or len(records._ids) <= 1: + return super().__get__(records, owner) + # multirecord case: return the union of the values of 'self' on records + get = super().__get__ + comodel = records.env[self.comodel_name] + return comodel.union(*[get(record, owner) for record in records]) + def _setup_regular_base(self, model): super(_Relational, self)._setup_regular_base(model) if self.comodel_name not in model.pool: |
