From ddd53dafb5fa6ba3cd5075c8e7b3214556c73b50 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Sat, 17 Mar 2012 01:24:39 +0000 Subject: Fixed #17918 - Handle proxy models correctly when sorting deletions for databases without deferred constraints. Thanks Nate Bragg for the report. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17756 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/deletion.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'django') diff --git a/django/db/models/deletion.py b/django/db/models/deletion.py index 7d6594afc0..730847ef21 100644 --- a/django/db/models/deletion.py +++ b/django/db/models/deletion.py @@ -76,6 +76,12 @@ class Collector(object): self.data = {} self.batches = {} # {model: {field: set([instances])}} self.field_updates = {} # {model: {(field, value): set([instances])}} + + # Tracks deletion-order dependency for databases without transactions + # or ability to defer constraint checks. Only concrete model classes + # should be included, as the dependencies exist only between actual + # database tables; proxy models are represented here by their concrete + # parent. self.dependencies = {} # {model: set([models])} def add(self, objs, source=None, nullable=False, reverse_dependency=False): @@ -101,7 +107,8 @@ class Collector(object): if source is not None and not nullable: if reverse_dependency: source, model = model, source - self.dependencies.setdefault(source, set()).add(model) + self.dependencies.setdefault( + source._meta.concrete_model, set()).add(model._meta.concrete_model) return new_objs def add_batch(self, model, field, objs): @@ -197,15 +204,17 @@ class Collector(object): def sort(self): sorted_models = [] + concrete_models = set() models = self.data.keys() while len(sorted_models) < len(models): found = False for model in models: if model in sorted_models: continue - dependencies = self.dependencies.get(model) - if not (dependencies and dependencies.difference(sorted_models)): + dependencies = self.dependencies.get(model._meta.concrete_model) + if not (dependencies and dependencies.difference(concrete_models)): sorted_models.append(model) + concrete_models.add(model._meta.concrete_model) found = True if not found: return -- cgit v1.3