mirror of
https://github.com/django/django.git
synced 2025-02-27 11:05:12 +00:00
Fixed #31831 -- Fixed migration operations ordering when adding order_with_respect_to and constraints/indexes.
This commit is contained in:
parent
366a93f174
commit
58a336a674
@ -182,12 +182,12 @@ class MigrationAutodetector:
|
|||||||
self.generate_removed_fields()
|
self.generate_removed_fields()
|
||||||
self.generate_added_fields()
|
self.generate_added_fields()
|
||||||
self.generate_altered_fields()
|
self.generate_altered_fields()
|
||||||
|
self.generate_altered_order_with_respect_to()
|
||||||
self.generate_altered_unique_together()
|
self.generate_altered_unique_together()
|
||||||
self.generate_altered_index_together()
|
self.generate_altered_index_together()
|
||||||
self.generate_added_indexes()
|
self.generate_added_indexes()
|
||||||
self.generate_added_constraints()
|
self.generate_added_constraints()
|
||||||
self.generate_altered_db_table()
|
self.generate_altered_db_table()
|
||||||
self.generate_altered_order_with_respect_to()
|
|
||||||
|
|
||||||
self._sort_migrations()
|
self._sort_migrations()
|
||||||
self._build_migration_list(graph)
|
self._build_migration_list(graph)
|
||||||
@ -613,6 +613,18 @@ class MigrationAutodetector:
|
|||||||
dependencies=list(set(dependencies)),
|
dependencies=list(set(dependencies)),
|
||||||
)
|
)
|
||||||
# Generate other opns
|
# Generate other opns
|
||||||
|
if order_with_respect_to:
|
||||||
|
self.add_operation(
|
||||||
|
app_label,
|
||||||
|
operations.AlterOrderWithRespectTo(
|
||||||
|
name=model_name,
|
||||||
|
order_with_respect_to=order_with_respect_to,
|
||||||
|
),
|
||||||
|
dependencies=[
|
||||||
|
(app_label, model_name, order_with_respect_to, True),
|
||||||
|
(app_label, model_name, None, True),
|
||||||
|
]
|
||||||
|
)
|
||||||
related_dependencies = [
|
related_dependencies = [
|
||||||
(app_label, model_name, name, True)
|
(app_label, model_name, name, True)
|
||||||
for name in sorted(related_fields)
|
for name in sorted(related_fields)
|
||||||
@ -654,19 +666,6 @@ class MigrationAutodetector:
|
|||||||
),
|
),
|
||||||
dependencies=related_dependencies
|
dependencies=related_dependencies
|
||||||
)
|
)
|
||||||
if order_with_respect_to:
|
|
||||||
self.add_operation(
|
|
||||||
app_label,
|
|
||||||
operations.AlterOrderWithRespectTo(
|
|
||||||
name=model_name,
|
|
||||||
order_with_respect_to=order_with_respect_to,
|
|
||||||
),
|
|
||||||
dependencies=[
|
|
||||||
(app_label, model_name, order_with_respect_to, True),
|
|
||||||
(app_label, model_name, None, True),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Fix relationships if the model changed from a proxy model to a
|
# Fix relationships if the model changed from a proxy model to a
|
||||||
# concrete model.
|
# concrete model.
|
||||||
if (app_label, model_name) in self.old_proxy_keys:
|
if (app_label, model_name) in self.old_proxy_keys:
|
||||||
|
@ -2179,6 +2179,87 @@ class AutodetectorTests(TestCase):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_add_model_order_with_respect_to_index_constraint(self):
|
||||||
|
tests = [
|
||||||
|
(
|
||||||
|
'AddIndex',
|
||||||
|
{'indexes': [
|
||||||
|
models.Index(fields=['_order'], name='book_order_idx'),
|
||||||
|
]},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'AddConstraint',
|
||||||
|
{'constraints': [
|
||||||
|
models.CheckConstraint(
|
||||||
|
check=models.Q(_order__gt=1),
|
||||||
|
name='book_order_gt_1',
|
||||||
|
),
|
||||||
|
]},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
for operation, extra_option in tests:
|
||||||
|
with self.subTest(operation=operation):
|
||||||
|
after = ModelState('testapp', 'Author', [
|
||||||
|
('id', models.AutoField(primary_key=True)),
|
||||||
|
('name', models.CharField(max_length=200)),
|
||||||
|
('book', models.ForeignKey('otherapp.Book', models.CASCADE)),
|
||||||
|
], options={
|
||||||
|
'order_with_respect_to': 'book',
|
||||||
|
**extra_option,
|
||||||
|
})
|
||||||
|
changes = self.get_changes([], [self.book, after])
|
||||||
|
self.assertNumberMigrations(changes, 'testapp', 1)
|
||||||
|
self.assertOperationTypes(changes, 'testapp', 0, [
|
||||||
|
'CreateModel', operation,
|
||||||
|
])
|
||||||
|
self.assertOperationAttributes(
|
||||||
|
changes,
|
||||||
|
'testapp',
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
name='Author',
|
||||||
|
options={'order_with_respect_to': 'book'},
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_set_alter_order_with_respect_to_index_constraint_foo_together(self):
|
||||||
|
tests = [
|
||||||
|
(
|
||||||
|
'AddIndex',
|
||||||
|
{'indexes': [
|
||||||
|
models.Index(fields=['_order'], name='book_order_idx'),
|
||||||
|
]},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'AddConstraint',
|
||||||
|
{'constraints': [
|
||||||
|
models.CheckConstraint(
|
||||||
|
check=models.Q(_order__gt=1),
|
||||||
|
name='book_order_gt_1',
|
||||||
|
),
|
||||||
|
]},
|
||||||
|
),
|
||||||
|
('AlterIndexTogether', {'index_together': {('name', '_order')}}),
|
||||||
|
('AlterUniqueTogether', {'unique_together': {('id', '_order')}}),
|
||||||
|
]
|
||||||
|
for operation, extra_option in tests:
|
||||||
|
with self.subTest(operation=operation):
|
||||||
|
after = ModelState('testapp', 'Author', [
|
||||||
|
('id', models.AutoField(primary_key=True)),
|
||||||
|
('name', models.CharField(max_length=200)),
|
||||||
|
('book', models.ForeignKey('otherapp.Book', models.CASCADE)),
|
||||||
|
], options={
|
||||||
|
'order_with_respect_to': 'book',
|
||||||
|
**extra_option,
|
||||||
|
})
|
||||||
|
changes = self.get_changes(
|
||||||
|
[self.book, self.author_with_book],
|
||||||
|
[self.book, after],
|
||||||
|
)
|
||||||
|
self.assertNumberMigrations(changes, 'testapp', 1)
|
||||||
|
self.assertOperationTypes(changes, 'testapp', 0, [
|
||||||
|
'AlterOrderWithRespectTo', operation,
|
||||||
|
])
|
||||||
|
|
||||||
def test_alter_model_managers(self):
|
def test_alter_model_managers(self):
|
||||||
"""
|
"""
|
||||||
Changing the model managers adds a new operation.
|
Changing the model managers adds a new operation.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user