summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordonghao <is_simple@163.com>2023-09-09 22:49:47 +0800
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-09-09 22:15:14 +0200
commit71820c9f91a70076526e2f526236fc4172d92fea (patch)
tree77c2650c51abf3055c96ec362d33cf142eba4124
parente41f9f94505f690525f16af8bd10e62e22bc0207 (diff)
Fixed #34820 -- Fixed migrations crash when changing a ForeignObject field.
-rw-r--r--AUTHORS1
-rw-r--r--django/db/backends/base/schema.py2
-rw-r--r--tests/migrations/test_operations.py46
3 files changed, 49 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index 51a2b1197a..6593f0889f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -391,6 +391,7 @@ answer newbie questions, and generally made Django that much better:
Hang Park <hangpark@kaist.ac.kr>
Hannes Ljungberg <hannes.ljungberg@gmail.com>
Hannes Struß <x@hannesstruss.de>
+ Hao Dong <https://github.com/RelaxedDong>
Harm Geerts <hgeerts@gmail.com>
Hasan Ramezani <hasan.r67@gmail.com>
Hawkeye
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 497008dcd6..493a47548a 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -1617,6 +1617,8 @@ class BaseDatabaseSchemaEditor:
return output
def _field_should_be_altered(self, old_field, new_field, ignore=None):
+ if not old_field.concrete and not new_field.concrete:
+ return False
ignore = ignore or set()
_, old_path, old_args, old_kwargs = old_field.deconstruct()
_, new_path, new_args, new_kwargs = new_field.deconstruct()
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index d4fc3e855a..01197d5fc8 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -2306,6 +2306,52 @@ class OperationTests(OperationTestBase):
operation.database_forwards(app_label, editor, new_state, project_state)
self.assertColumnExists(rider_table, "pony_id")
+ def test_alter_field_foreignobject_noop(self):
+ app_label = "test_alflfo_noop"
+ project_state = self.set_up_test_model(app_label)
+ project_state = self.apply_operations(
+ app_label,
+ project_state,
+ [
+ migrations.CreateModel(
+ "Rider",
+ fields=[
+ ("pony_id", models.IntegerField()),
+ (
+ "pony",
+ models.ForeignObject(
+ f"{app_label}.Pony",
+ models.CASCADE,
+ from_fields=("pony_id",),
+ to_fields=("id",),
+ ),
+ ),
+ ],
+ ),
+ ],
+ )
+ operation = migrations.AlterField(
+ "Rider",
+ "pony",
+ models.ForeignObject(
+ f"{app_label}.Pony",
+ models.CASCADE,
+ from_fields=("pony_id",),
+ to_fields=("id",),
+ null=True,
+ ),
+ )
+ new_state = project_state.clone()
+ operation.state_forwards(app_label, new_state)
+ with (
+ CaptureQueriesContext(connection) as ctx,
+ connection.schema_editor() as editor,
+ ):
+ operation.database_forwards(app_label, editor, project_state, new_state)
+ self.assertIs(
+ any("ALTER" in query["sql"] for query in ctx.captured_queries), False
+ )
+
@skipUnlessDBFeature("supports_comments")
def test_alter_model_table_comment(self):
app_label = "test_almotaco"