From bb38407c557ba55cc555691706e53f3030f5dceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 11 Jun 2026 14:29:17 +0200 Subject: [PATCH] Support query without where clause when searching on Many2One with where operator When not using subquery but EXISTS and having a target domain converted into UNION, the query result does not have a 'where' clause. Closes #14889 (grafted from 96982406e129d1e063c1a332289376f45e586ecc) --HG-- branch : 8.0 --- trytond/trytond/model/fields/many2one.py | 5 ++++- trytond/trytond/tests/test_field_many2one.py | 21 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/trytond/trytond/model/fields/many2one.py b/trytond/trytond/model/fields/many2one.py index c6406ff8d2..6394efe9e2 100644 --- a/trytond/trytond/model/fields/many2one.py +++ b/trytond/trytond/model/fields/many2one.py @@ -284,7 +284,10 @@ class Many2One(Field): if use_subquery: expression = column.in_(query) else: - query.where &= target_id == column + if query.where is None: + query.where = target_id == column + else: + query.where &= target_id == column expression = Exists(query) if operator.startswith('not'): return ~expression diff --git a/trytond/trytond/tests/test_field_many2one.py b/trytond/trytond/tests/test_field_many2one.py index fb94fa4eaa..e85b8b528b 100644 --- a/trytond/trytond/tests/test_field_many2one.py +++ b/trytond/trytond/tests/test_field_many2one.py @@ -332,6 +332,27 @@ class SearchTestCaseMixin: ], query=True) self.assertIn(self._strategy, str(query)) + @with_transaction() + def test_search_where_target_union(self): + "Test search on Many2One using where and UNION-ed query on target" + pool = Pool() + Target = pool.get('test.many2one_target') + Many2One = pool.get('test.many2one') + target1, target2 = Target.create([ + {'value': 1}, + {'value': 2}, + ]) + many2one1, many2one2 = Many2One.create([ + {'many2one': target1}, + {'many2one': target2}, + ]) + + many2ones = Many2One.search([ + ('many2one', 'where', + ['OR', ('value', '=', 1), ('write_uid.id', '=', -1)]), + ]) + self.assertListEqual(many2ones, [many2one1]) + class FieldMany2OneTestCase( TestCase, CommonTestCaseMixin, SearchTestCaseMixin):