1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Fixed #373 -- Added CompositePrimaryKey.

Thanks Lily Foote and Simon Charette for reviews and mentoring
this Google Summer of Code 2024 project.

Co-authored-by: Simon Charette <charette.s@gmail.com>
Co-authored-by: Lily Foote <code@lilyf.org>
This commit is contained in:
Bendeguz Csirmaz
2024-04-07 10:32:16 +08:00
committed by Sarah Boyce
parent 86661f2449
commit 978aae4334
43 changed files with 3078 additions and 29 deletions

View File

@@ -6287,6 +6287,61 @@ class OperationTests(OperationTestBase):
self.assertEqual(pony_new.generated, 1)
self.assertEqual(pony_new.static, 2)
def test_composite_pk_operations(self):
app_label = "test_d8d90af6"
project_state = self.set_up_test_model(app_label)
operation_1 = migrations.AddField(
"Pony", "pk", models.CompositePrimaryKey("id", "pink")
)
operation_2 = migrations.AlterField("Pony", "id", models.IntegerField())
operation_3 = migrations.RemoveField("Pony", "pk")
table_name = f"{app_label}_pony"
# 1. Add field (pk).
new_state = project_state.clone()
operation_1.state_forwards(app_label, new_state)
with connection.schema_editor() as editor:
operation_1.database_forwards(app_label, editor, project_state, new_state)
self.assertColumnNotExists(table_name, "pk")
Pony = new_state.apps.get_model(app_label, "pony")
obj_1 = Pony.objects.create(weight=1)
msg = (
f"obj_1={obj_1}, "
f"obj_1.id={obj_1.id}, "
f"obj_1.pink={obj_1.pink}, "
f"obj_1.pk={obj_1.pk}, "
f"Pony._meta.pk={repr(Pony._meta.pk)}, "
f"Pony._meta.get_field('id')={repr(Pony._meta.get_field('id'))}"
)
self.assertEqual(obj_1.pink, 3, msg)
self.assertEqual(obj_1.pk, (obj_1.id, obj_1.pink), msg)
# 2. Alter field (id -> IntegerField()).
project_state, new_state = new_state, new_state.clone()
operation_2.state_forwards(app_label, new_state)
with connection.schema_editor() as editor:
operation_2.database_forwards(app_label, editor, project_state, new_state)
Pony = new_state.apps.get_model(app_label, "pony")
obj_1 = Pony.objects.get(id=obj_1.id)
self.assertEqual(obj_1.pink, 3)
self.assertEqual(obj_1.pk, (obj_1.id, obj_1.pink))
obj_2 = Pony.objects.create(id=2, weight=2)
self.assertEqual(obj_2.id, 2)
self.assertEqual(obj_2.pink, 3)
self.assertEqual(obj_2.pk, (obj_2.id, obj_2.pink))
# 3. Remove field (pk).
project_state, new_state = new_state, new_state.clone()
operation_3.state_forwards(app_label, new_state)
with connection.schema_editor() as editor:
operation_3.database_forwards(app_label, editor, project_state, new_state)
Pony = new_state.apps.get_model(app_label, "pony")
obj_1 = Pony.objects.get(id=obj_1.id)
self.assertEqual(obj_1.pk, obj_1.id)
obj_2 = Pony.objects.get(id=obj_2.id)
self.assertEqual(obj_2.id, 2)
self.assertEqual(obj_2.pk, obj_2.id)
class SwappableOperationTests(OperationTestBase):
"""