diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 9e5aabaaa38..2524a2e67f7 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -2878,6 +2878,21 @@ class TestX2many(common.TransactionCase): }) self.assertTrue(field.unlink()) + def test_custom_m2m_related(self): + # this checks the ondelete of a related many2many field + model_id = self.env['ir.model']._get_id('res.partner') + field = self.env['ir.model.fields'].create({ + 'name': 'x_foo', + 'field_description': 'Foo', + 'model_id': model_id, + 'ttype': 'many2many', + 'relation': 'res.partner.category', + 'related': 'category_id', + 'readonly': True, + 'store': True, + }) + self.assertTrue(field.unlink()) + class TestHtmlField(common.TransactionCase): diff --git a/odoo/fields.py b/odoo/fields.py index 256b5e37616..381034dc0f2 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -3720,7 +3720,7 @@ class Many2many(_RelationalMulti): column1 = None # column of table referring to model column2 = None # column of table referring to comodel auto_join = False # whether joins are generated upon search - ondelete = None # optional ondelete for the column2 fkey + ondelete = 'cascade' # optional ondelete for the column2 fkey def __init__(self, comodel_name=Default, relation=Default, column1=Default, column2=Default, string=Default, **kwargs): @@ -3735,17 +3735,15 @@ class Many2many(_RelationalMulti): def setup_nonrelated(self, model): super().setup_nonrelated(model) - # 3 cases: - # 1) The ondelete attribute is not defined, we assign it a sensible default - # 2) The ondelete attribute is defined and its definition makes sense - # 3) The ondelete attribute is explicitly defined as 'set null' for a m2m, + # 2 cases: + # 1) The ondelete attribute is defined and its definition makes sense + # 2) The ondelete attribute is explicitly defined as 'set null' for a m2m, # this is considered a programming error. - self.ondelete = self.ondelete or 'cascade' - if self.ondelete == 'set null': + if self.ondelete not in ('cascade', 'restrict'): raise ValueError( "The m2m field %s of model %s declares its ondelete policy " - "as being 'set null'. Only 'restrict' and 'cascade' make sense." - % (self.name, model._name) + "as being %r. Only 'restrict' and 'cascade' make sense." + % (self.name, model._name, self.ondelete) ) if self.store: if not (self.relation and self.column1 and self.column2):