diff --git a/django/core/management/commands/flush.py b/django/core/management/commands/flush.py index 02f558b31d4..53e5e389f04 100644 --- a/django/core/management/commands/flush.py +++ b/django/core/management/commands/flush.py @@ -85,9 +85,13 @@ Are you sure you want to do this? # Reinstall the initial_data fixture. if options.get('load_initial_data'): - # Reinstall the initial_data fixture. - call_command('loaddata', 'initial_data', **options) - + # Reinstall the initial_data fixture for apps without migrations. + from django.db.migrations.executor import MigrationExecutor + executor = MigrationExecutor(connection) + app_options = options.copy() + for app_label in executor.loader.unmigrated_apps: + app_options['app_label'] = app_label + call_command('loaddata', 'initial_data', **app_options) else: self.stdout.write("Flush cancelled.\n") diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 32500045f08..d9cf2e4be2a 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -14,3 +14,6 @@ Bugfixes * Fixed a migration crash when adding an explicit ``id`` field to a model on SQLite (:ticket:`23702`). + +* Prevented :djadmin:`flush` from loading initial data for migrated apps + (:ticket:`23699`). diff --git a/tests/fixtures_migration/__init__.py b/tests/fixtures_migration/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures_migration/fixtures/initial_data.json b/tests/fixtures_migration/fixtures/initial_data.json new file mode 100644 index 00000000000..2e979fc8421 --- /dev/null +++ b/tests/fixtures_migration/fixtures/initial_data.json @@ -0,0 +1,9 @@ +[ + { + "pk": "10", + "model": "fixtures_migration.book", + "fields": { + "name": "Achieving self-awareness of Python programs" + } + } +] diff --git a/tests/fixtures_migration/migrations/0001_initial.py b/tests/fixtures_migration/migrations/0001_initial.py new file mode 100644 index 00000000000..f1db74a874e --- /dev/null +++ b/tests/fixtures_migration/migrations/0001_initial.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + operations = [ + migrations.CreateModel( + "Book", + [ + ("name", models.CharField(max_length=100)), + ], + ), + ] diff --git a/tests/fixtures_migration/migrations/__init__.py b/tests/fixtures_migration/migrations/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures_migration/models.py b/tests/fixtures_migration/models.py new file mode 100644 index 00000000000..3c1d9b63fde --- /dev/null +++ b/tests/fixtures_migration/models.py @@ -0,0 +1,5 @@ +from django.db import models + + +class Book(models.Model): + name = models.CharField(max_length=100) diff --git a/tests/fixtures_migration/tests.py b/tests/fixtures_migration/tests.py new file mode 100644 index 00000000000..9a363385e69 --- /dev/null +++ b/tests/fixtures_migration/tests.py @@ -0,0 +1,31 @@ +from django.test import TestCase +from django.core import management + +from .models import Book + + +class TestNoInitialDataLoading(TestCase): + """ + Apps with migrations should ignore initial data. This test can be removed + in Django 1.9 when migrations become required and initial data is no longer + supported. + """ + available_apps = ['fixtures_migration'] + + def test_migrate(self): + self.assertQuerysetEqual(Book.objects.all(), []) + management.call_command( + 'migrate', + verbosity=0, + ) + self.assertQuerysetEqual(Book.objects.all(), []) + + def test_flush(self): + self.assertQuerysetEqual(Book.objects.all(), []) + management.call_command( + 'flush', + verbosity=0, + interactive=False, + load_initial_data=False + ) + self.assertQuerysetEqual(Book.objects.all(), [])