diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-08-22 22:52:12 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-08-22 22:52:12 +0000 |
| commit | f62e5a56e8a99ad3e0ab03f9bb3e0afd99872f58 (patch) | |
| tree | 68ab8f2578ef9476be5d8620e4532f2db84b5dbe /lib/sqlalchemy/orm/unitofwork.py | |
| parent | a8d1aecfabe288dcfce3c01bfd87a5a6aff3683c (diff) | |
| download | sqlalchemy-f62e5a56e8a99ad3e0ab03f9bb3e0afd99872f58.tar.gz | |
the "check for orphans" step will cascade the delete operation to child objects.
Diffstat (limited to 'lib/sqlalchemy/orm/unitofwork.py')
| -rw-r--r-- | lib/sqlalchemy/orm/unitofwork.py | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 00d34a104..c0bb219a3 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -180,18 +180,24 @@ class UnitOfWork(object): else: objset = None + processed = util.Set() for obj in [n for n in self.new] + [d for d in self.dirty]: if objset is not None and not obj in objset: continue - if obj in self.deleted: + if obj in self.deleted or obj in processed: continue if object_mapper(obj)._is_orphan(obj): - flush_context.register_object(obj, isdelete=True) + for c in [obj] + list(object_mapper(obj).cascade_iterator('delete', obj)): + if c in processed: + continue + flush_context.register_object(c, isdelete=True) + processed.add(c) else: flush_context.register_object(obj) - + processed.add(obj) + for obj in self.deleted: - if objset is not None and not obj in objset: + if (objset is not None and not obj in objset) or obj in processed: continue flush_context.register_object(obj, isdelete=True) |
