mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #23822 -- Added support for serializing model managers in migration
Thanks to Shai Berger, Loïc Bistuer, Simon Charette, Andrew Godwin, Tim Graham, Carl Meyer, and others for their review and input.
This commit is contained in:
committed by
Tim Graham
parent
e37ab311fc
commit
aa5ef0d4fc
@@ -17,6 +17,7 @@ from django.db.utils import IntegrityError, DatabaseError
|
||||
from django.test import override_settings
|
||||
from django.utils import six
|
||||
|
||||
from .models import FoodManager, FoodQuerySet
|
||||
from .test_base import MigrationTestBase
|
||||
|
||||
|
||||
@@ -48,7 +49,7 @@ class OperationTestBase(MigrationTestBase):
|
||||
return project_state, new_state
|
||||
|
||||
def set_up_test_model(self, app_label, second_model=False, third_model=False,
|
||||
related_model=False, mti_model=False, proxy_model=False,
|
||||
related_model=False, mti_model=False, proxy_model=False, manager_model=False,
|
||||
unique_together=False, options=False, db_table=None, index_together=False):
|
||||
"""
|
||||
Creates a test model state and database table.
|
||||
@@ -142,6 +143,18 @@ class OperationTestBase(MigrationTestBase):
|
||||
options={"proxy": True},
|
||||
bases=['%s.Pony' % app_label],
|
||||
))
|
||||
if manager_model:
|
||||
operations.append(migrations.CreateModel(
|
||||
"Food",
|
||||
fields=[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
],
|
||||
managers=[
|
||||
("food_qs", FoodQuerySet.as_manager()),
|
||||
("food_mgr", FoodManager("a", "b")),
|
||||
("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
||||
]
|
||||
))
|
||||
|
||||
return self.apply_operations(app_label, ProjectState(), operations)
|
||||
|
||||
@@ -186,6 +199,10 @@ class OperationTests(OperationTestBase):
|
||||
self.assertEqual(definition[0], "CreateModel")
|
||||
self.assertEqual(definition[1], [])
|
||||
self.assertEqual(sorted(definition[2].keys()), ["fields", "name"])
|
||||
# And default manager not in set
|
||||
operation = migrations.CreateModel("Foo", fields=[], managers=[("objects", models.Manager())])
|
||||
definition = operation.deconstruct()
|
||||
self.assertNotIn('managers', definition[2])
|
||||
|
||||
def test_create_model_with_unique_after(self):
|
||||
"""
|
||||
@@ -365,6 +382,37 @@ class OperationTests(OperationTestBase):
|
||||
self.assertTableNotExists("test_crummo_unmanagedpony")
|
||||
self.assertTableExists("test_crummo_pony")
|
||||
|
||||
def test_create_model_managers(self):
|
||||
"""
|
||||
Tests that the managers on a model are set.
|
||||
"""
|
||||
project_state = self.set_up_test_model("test_cmoma")
|
||||
# Test the state alteration
|
||||
operation = migrations.CreateModel(
|
||||
"Food",
|
||||
fields=[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
],
|
||||
managers=[
|
||||
("food_qs", FoodQuerySet.as_manager()),
|
||||
("food_mgr", FoodManager("a", "b")),
|
||||
("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
||||
]
|
||||
)
|
||||
self.assertEqual(operation.describe(), "Create model Food")
|
||||
new_state = project_state.clone()
|
||||
operation.state_forwards("test_cmoma", new_state)
|
||||
self.assertIn(("test_cmoma", "food"), new_state.models)
|
||||
managers = new_state.models["test_cmoma", "food"].managers
|
||||
self.assertEqual(managers[0][0], "food_qs")
|
||||
self.assertIsInstance(managers[0][1], models.Manager)
|
||||
self.assertEqual(managers[1][0], "food_mgr")
|
||||
self.assertIsInstance(managers[1][1], FoodManager)
|
||||
self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
||||
self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
||||
self.assertIsInstance(managers[2][1], FoodManager)
|
||||
self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
||||
|
||||
def test_delete_model(self):
|
||||
"""
|
||||
Tests the DeleteModel operation.
|
||||
@@ -1208,6 +1256,61 @@ class OperationTests(OperationTestBase):
|
||||
self.assertEqual(definition[1], [])
|
||||
self.assertEqual(definition[2], {'name': "Rider", 'order_with_respect_to': "pony"})
|
||||
|
||||
def test_alter_model_managers(self):
|
||||
"""
|
||||
Tests that the managers on a model are set.
|
||||
"""
|
||||
project_state = self.set_up_test_model("test_almoma")
|
||||
# Test the state alteration
|
||||
operation = migrations.AlterModelManagers(
|
||||
"Pony",
|
||||
managers=[
|
||||
("food_qs", FoodQuerySet.as_manager()),
|
||||
("food_mgr", FoodManager("a", "b")),
|
||||
("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
||||
]
|
||||
)
|
||||
self.assertEqual(operation.describe(), "Change managers on Pony")
|
||||
managers = project_state.models["test_almoma", "pony"].managers
|
||||
self.assertEqual(managers, [])
|
||||
|
||||
new_state = project_state.clone()
|
||||
operation.state_forwards("test_almoma", new_state)
|
||||
self.assertIn(("test_almoma", "pony"), new_state.models)
|
||||
managers = new_state.models["test_almoma", "pony"].managers
|
||||
self.assertEqual(managers[0][0], "food_qs")
|
||||
self.assertIsInstance(managers[0][1], models.Manager)
|
||||
self.assertEqual(managers[1][0], "food_mgr")
|
||||
self.assertIsInstance(managers[1][1], FoodManager)
|
||||
self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
||||
self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
||||
self.assertIsInstance(managers[2][1], FoodManager)
|
||||
self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
||||
|
||||
def test_alter_model_managers_emptying(self):
|
||||
"""
|
||||
Tests that the managers on a model are set.
|
||||
"""
|
||||
project_state = self.set_up_test_model("test_almomae", manager_model=True)
|
||||
# Test the state alteration
|
||||
operation = migrations.AlterModelManagers("Food", managers=[])
|
||||
self.assertEqual(operation.describe(), "Change managers on Food")
|
||||
self.assertIn(("test_almomae", "food"), project_state.models)
|
||||
managers = project_state.models["test_almomae", "food"].managers
|
||||
self.assertEqual(managers[0][0], "food_qs")
|
||||
self.assertIsInstance(managers[0][1], models.Manager)
|
||||
self.assertEqual(managers[1][0], "food_mgr")
|
||||
self.assertIsInstance(managers[1][1], FoodManager)
|
||||
self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
||||
self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
||||
self.assertIsInstance(managers[2][1], FoodManager)
|
||||
self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
||||
|
||||
new_state = project_state.clone()
|
||||
operation.state_forwards("test_almomae", new_state)
|
||||
managers = new_state.models["test_almomae", "food"].managers
|
||||
self.assertEqual(managers, [])
|
||||
|
||||
def test_alter_fk(self):
|
||||
"""
|
||||
Tests that creating and then altering an FK works correctly
|
||||
|
||||
Reference in New Issue
Block a user