From cf663a0e073fb2c3aefeaf574cddbcbb2eaff2c0 Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Mon, 9 Jan 2017 15:32:52 +0100 Subject: [PATCH] Update reset_polymorphic_ctype, improve ignore_existing parameter --- polymorphic/utils.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/polymorphic/utils.py b/polymorphic/utils.py index 23d7a01..8f1ac75 100644 --- a/polymorphic/utils.py +++ b/polymorphic/utils.py @@ -1,4 +1,5 @@ from django.contrib.contenttypes.models import ContentType +from django.db import DEFAULT_DB_ALIAS def reset_polymorphic_ctype(*models, **filters): @@ -10,12 +11,18 @@ def reset_polymorphic_ctype(*models, **filters): Add ``preserve_existing=True`` to skip models which already have a polymorphic content type. """ - preserve_existing = filters.pop('preserve_existing', False) - for new_model in models: - new_ct = ContentType.objects.get_for_model(new_model) + using = filters.pop('using', DEFAULT_DB_ALIAS) + ignore_existing = filters.pop('ignore_existing', False) + if ignore_existing: + # When excluding models, make sure we don't ignore the models we + # just assigned the an content type to. hence, start with child first. + models = reversed(models) - qs = new_model.objects.all() - if preserve_existing: + for new_model in models: + new_ct = ContentType.objects.db_manager(using).get_for_model(new_model) + + qs = new_model.objects.db_manager(using) + if ignore_existing: qs = qs.filter(polymorphic_ctype__isnull=True) if filters: qs = qs.filter(**filters)