diff --git a/django/core/management/commands/dumpdata.py b/django/core/management/commands/dumpdata.py index 9172d938d2..7e05b89160 100644 --- a/django/core/management/commands/dumpdata.py +++ b/django/core/management/commands/dumpdata.py @@ -73,7 +73,8 @@ class Command(BaseCommand): model_list = get_models(app) for model in model_list: - objects.extend(model._default_manager.all()) + if not model._meta.proxy: + objects.extend(model._default_manager.all()) try: return serializers.serialize(format, objects, indent=indent) diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py index 1ac75426c1..43f47048e0 100644 --- a/django/db/backends/creation.py +++ b/django/db/backends/creation.py @@ -40,7 +40,7 @@ class BaseDatabaseCreation(object): from django.db import models opts = model._meta - if not opts.managed: + if not opts.managed or opts.proxy: return [], {} final_output = [] table_output = [] @@ -121,7 +121,7 @@ class BaseDatabaseCreation(object): "Returns any ALTER TABLE statements to add constraints after the fact." from django.db.backends.util import truncate_name - if not model._meta.managed: + if not model._meta.managed or model._meta.proxy: return [] qn = self.connection.ops.quote_name final_output = [] @@ -236,7 +236,7 @@ class BaseDatabaseCreation(object): def sql_indexes_for_model(self, model, style): "Returns the CREATE INDEX SQL statements for a single model" - if not model._meta.managed: + if not model._meta.managed or model._meta.proxy: return [] output = [] for f in model._meta.local_fields: @@ -268,7 +268,7 @@ class BaseDatabaseCreation(object): def sql_destroy_model(self, model, references_to_delete, style): "Return the DROP TABLE and restraint dropping statements for a single model" - if not model._meta.managed: + if not model._meta.managed or model._meta.proxy: return [] # Drop the table now qn = self.connection.ops.quote_name @@ -286,7 +286,7 @@ class BaseDatabaseCreation(object): def sql_remove_table_constraints(self, model, references_to_delete, style): from django.db.backends.util import truncate_name - if not model._meta.managed: + if not model._meta.managed or model._meta.proxy: return [] output = [] qn = self.connection.ops.quote_name diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py index 16a9fc4fc5..e33471646c 100644 --- a/tests/regressiontests/fixtures_regress/models.py +++ b/tests/regressiontests/fixtures_regress/models.py @@ -54,7 +54,7 @@ class Parent(models.Model): class Child(Parent): data = models.CharField(max_length=10) -# Models to regresison check #7572 +# Models to regression test #7572 class Channel(models.Model): name = models.CharField(max_length=255) @@ -65,6 +65,14 @@ class Article(models.Model): class Meta: ordering = ('id',) +# Models to regression test #11428 +class Widget(models.Model): + name = models.CharField(max_length=255) + +class WidgetProxy(Widget): + class Meta: + proxy = True + __test__ = {'API_TESTS':""" >>> from django.core import management @@ -170,4 +178,18 @@ Weight = 1.2 () >>> management.call_command('dumpdata', 'fixtures_regress.animal', format='json') [{"pk": 1, "model": "fixtures_regress.animal", "fields": {"count": 3, "weight": 1.2, "name": "Lion", "latin_name": "Panthera leo"}}, {"pk": 2, "model": "fixtures_regress.animal", "fields": {"count": 2, "weight": 2.29..., "name": "Platypus", "latin_name": "Ornithorhynchus anatinus"}}, {"pk": 10, "model": "fixtures_regress.animal", "fields": {"count": 42, "weight": 1.2, "name": "Emu", "latin_name": "Dromaius novaehollandiae"}}] +############################################### +# Regression for #11428 - Proxy models aren't included +# when you run dumpdata over an entire app + +# Flush out the database first +>>> management.call_command('reset', 'fixtures_regress', interactive=False, verbosity=0) + +# Create an instance of the concrete class +>>> Widget(name='grommet').save() + +# Dump data for the entire app. The proxy class shouldn't be included +>>> management.call_command('dumpdata', 'fixtures_regress', format='json') +[{"pk": 1, "model": "fixtures_regress.widget", "fields": {"name": "grommet"}}] + """}