diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py index 09195c6784..d8369f36e4 100644 --- a/trytond/model/fields/many2many.py +++ b/trytond/model/fields/many2many.py @@ -233,14 +233,15 @@ class Many2Many(Field): action = value[0] args = value[1:] actions[action](ids, *args) - if relation_to_create: - Relation.create(relation_to_create) + # Ordered operations to avoid uniqueness/overlapping constraints if relation_to_delete: Relation.delete(relation_to_delete) - if target_to_write: - Target.write(*target_to_write) if target_to_delete: Target.delete(target_to_delete) + if target_to_write: + Target.write(*target_to_write) + if relation_to_create: + Relation.create(relation_to_create) def get_target(self): 'Return the target model' diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py index 39ac0e8dcc..605ffadbb7 100644 --- a/trytond/model/fields/one2many.py +++ b/trytond/model/fields/one2many.py @@ -213,12 +213,13 @@ class One2Many(Field): action = value[0] args = value[1:] actions[action](ids, *args) - if to_create: - Target.create(to_create) - if to_write: - Target.write(*to_write) + # Ordered operations to avoid uniqueness/overlapping constraints if to_delete: Target.delete(to_delete) + if to_write: + Target.write(*to_write) + if to_create: + Target.create(to_create) def get_target(self): 'Return the target Model' diff --git a/trytond/model/fields/one2one.py b/trytond/model/fields/one2one.py index 3b9e322f5a..c32ffb0c8a 100644 --- a/trytond/model/fields/one2one.py +++ b/trytond/model/fields/one2one.py @@ -47,6 +47,7 @@ class One2One(Many2Many): self.origin: record_id, self.target: value, }) + # Ordered operations to avoid uniqueness/overlapping constraints if to_delete: Relation.delete(to_delete) if to_create: