diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-01-13 18:18:23 +0100 |
|---|---|---|
| committer | Markus Holtermann <info@markusholtermann.eu> | 2015-01-14 16:09:33 +0100 |
| commit | 88786afbffc5c095f6491e080afea394f63bb44a (patch) | |
| tree | 631f1f1ca340a5641271ee058304244e153a4bfa /django | |
| parent | ec7ef5afbbd12abe74314d557aabb3d85d667749 (diff) | |
Fixed #24147 -- Prevented managers leaking model during migrations
Thanks Tim Graham for the review.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/migrations/state.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/django/db/migrations/state.py b/django/db/migrations/state.py index 84b8c0dbe9..7eb1e5b8b9 100644 --- a/django/db/migrations/state.py +++ b/django/db/migrations/state.py @@ -400,6 +400,19 @@ class ModelState(object): field_class = import_string(path) yield name, field_class(*args, **kwargs) + def construct_managers(self): + "Deep-clone the managers using deconstruction" + # Sort all managers by their creation counter + sorted_managers = sorted(self.managers, key=lambda v: v[1].creation_counter) + for mgr_name, manager in sorted_managers: + as_manager, manager_path, qs_path, args, kwargs = manager.deconstruct() + if as_manager: + qs_class = import_string(qs_path) + yield mgr_name, qs_class.as_manager() + else: + manager_class = import_string(manager_path) + yield mgr_name, manager_class(*args, **kwargs) + def clone(self): "Returns an exact copy of this ModelState" return self.__class__( @@ -408,7 +421,7 @@ class ModelState(object): fields=list(self.construct_fields()), options=dict(self.options), bases=self.bases, - managers=self.managers, + managers=list(self.construct_managers()), ) def render(self, apps): @@ -431,8 +444,7 @@ class ModelState(object): body['__module__'] = "__fake__" # Restore managers - for mgr_name, manager in self.managers: - body[mgr_name] = manager + body.update(self.construct_managers()) # Then, make a Model object (apps.register_model is called in __new__) return type( |
