Commits

Anonymous committed 2cb7d99

Fixed #11428 -- Ensured that SQL generating commands and dumpdata don't include proxy models in their output. Thanks to Anssi Kaariainen for the report.

Comments (0)

Files changed (3)

django/core/management/commands/dumpdata.py

                 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)

django/db/backends/creation.py

         from django.db import models
 
         opts = model._meta
-        if not opts.managed:
+        if not opts.managed or opts.proxy:
             return [], {}
         final_output = []
         table_output = []
         "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 = []
 
     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:
 
     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
     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

tests/regressiontests/fixtures_regress/models.py

 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)
 
     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
 
 >>> 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"}}]
+
 """}