{{{
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File
"/home/s120374/projects/dev/django/django/core/management/__init__.py",
line 330, in execute_from_command_line
utility.execute()
File
"/home/s120374/projects/dev/django/django/core/management/__init__.py",
line 322, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/s120374/projects/dev/django/django/core/management/base.py",
line 350, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/s120374/projects/dev/django/django/core/management/base.py",
line 401, in execute
output = self.handle(*args, **options)
File
"/home/s120374/projects/dev/django/django/core/management/commands/migrate.py",
line 173, in handle
ProjectState.from_apps(apps),
File "/home/s120374/projects/dev/django/django/db/migrations/state.py",
line 94, in from_apps
model_state = ModelState.from_model(model)
File "/home/s120374/projects/dev/django/django/db/migrations/state.py",
line 348, in from_model
default_manager_name = model._default_manager.name
AttributeError: type object 'Swappable' has no attribute
'_default_manager'
}}}
The same happens when making a new migration using `makemigrations`, and
when migrating an app that doesn't contain the swappable model.
--
Ticket URL: <https://code.djangoproject.com/ticket/24291>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Comment:
Test that currently fails:
{{{
diff --git a/tests/migrations/test_state.py
b/tests/migrations/test_state.py
index a7dbdbe..ca7a21e 100644
--- a/tests/migrations/test_state.py
+++ b/tests/migrations/test_state.py
@@ -2,7 +2,7 @@
from django.db import models
from django.db.migrations.operations import RemoveField
from django.db.migrations.state import ProjectState, ModelState,
InvalidBasesError
-from django.test import TestCase
+from django.test import TestCase, override_settings
from .models import (FoodManager, FoodQuerySet, ModelWithCustomBase,
NoMigrationFoodManager)
@@ -543,6 +543,37 @@ def test_manager_refer_correct_model_version(self):
self.assertIsNot(old_model.food_mgr.model,
new_model.food_mgr.model)
self.assertIsNot(old_model.food_qs.model,
new_model.food_qs.model)
+ @override_settings(TEST_SWAPPABLE_MODEL="migrations.SomeFakeModel")
+ def test_create_swappable(self):
+ """
+ Tests making a ProjectState from an Apps
+ """
+
+ new_apps = Apps(["migrations"])
+
+ class Author(models.Model):
+ name = models.CharField(max_length=255)
+ bio = models.TextField()
+ age = models.IntegerField(blank=True, null=True)
+
+ class Meta:
+ app_label = "migrations"
+ apps = new_apps
+ swappable = "TEST_SWAPPABLE_MODEL"
+
+
+ project_state = ProjectState.from_apps(new_apps)
+ author_state = project_state.models['migrations', 'author']
+
+ self.assertEqual(author_state.app_label, "migrations")
+ self.assertEqual(author_state.name, "Author")
+ self.assertEqual([x for x, y in author_state.fields], ["id",
"name", "bio", "age"])
+ self.assertEqual(author_state.fields[1][1].max_length, 255)
+ self.assertEqual(author_state.fields[2][1].null, False)
+ self.assertEqual(author_state.fields[3][1].null, True)
+ self.assertEqual(author_state.options, {"swappable":
"TEST_SWAPPABLE_MODEL"})
+ self.assertEqual(author_state.bases, (models.Model, ))
+
class ModelStateTests(TestCase):
def test_custom_model_base(self):
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:1>
* owner: nobody => knbk
* status: new => assigned
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:2>
* cc: MarkusH (added)
* stage: Unreviewed => Accepted
Comment:
PR: https://github.com/django/django/pull/4071
Can you confirm that this also happens on 1.8? In that case, can you
adjust the version on the ticket, please.
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:3>
* version: master => 1.8alpha1
Comment:
Yes, the same happens on 1.8.
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:4>
* severity: Normal => Release blocker
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:5>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:6>
* needs_better_patch: 0 => 1
* stage: Ready for checkin => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:7>
* needs_better_patch: 1 => 0
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:8>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"15dc8d1c9d3697170a2c59ecaa7a2b4ba58f5990"]:
{{{
#!CommitTicketReference repository=""
revision="15dc8d1c9d3697170a2c59ecaa7a2b4ba58f5990"
Fixed #24291 - Fixed migration ModelState generation with unused swappable
models
Swapped out models don't have a _default_manager unless they have
explicitly defined managers. ModelState.from_model() now accounts for
this case and uses an empty list for managers if no explicit managers
are defined and a model is swapped out.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:9>
Comment (by Markus Holtermann <info@…>):
In [changeset:"84c9b24c5afba524c8dcb4bb5f7c40c43291d132"]:
{{{
#!CommitTicketReference repository=""
revision="84c9b24c5afba524c8dcb4bb5f7c40c43291d132"
[1.8.x] Fixed #24291 - Fixed migration ModelState generation with unused
swappable models
Swapped out models don't have a _default_manager unless they have
explicitly defined managers. ModelState.from_model() now accounts for
this case and uses an empty list for managers if no explicit managers
are defined and a model is swapped out.
Backport of 15dc8d1c9d3697170a2c59ecaa7a2b4ba58f5990 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24291#comment:10>