diff options
| author | donghao <is_simple@163.com> | 2023-09-09 21:39:43 +0800 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-09-11 08:46:43 +0200 |
| commit | 938170008ea48dff8f89b0839998a1eec939ddf4 (patch) | |
| tree | c6ce582aa315f6b8f13df1fb2a32880452c27552 | |
| parent | 369b498219be791ebec8233208f08f07621b8359 (diff) | |
Fixed #34824 -- Prevented unnecessary AlterField when ForeignObject.from_fields/to_fields is not a tuple.
| -rw-r--r-- | django/db/migrations/autodetector.py | 3 | ||||
| -rw-r--r-- | tests/migrations/test_autodetector.py | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 154ac44419..3a0ee511ff 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -1157,6 +1157,9 @@ class MigrationAutodetector: for to_field in new_field.to_fields ] ) + if old_from_fields := getattr(old_field, "from_fields", None): + old_field.from_fields = tuple(old_from_fields) + old_field.to_fields = tuple(old_field.to_fields) dependencies.extend( self._get_dependencies_for_foreign_key( app_label, diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 4c91659ca8..85674e552a 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -1,3 +1,4 @@ +import copy import functools import re from unittest import mock @@ -1627,6 +1628,37 @@ class AutodetectorTests(BaseAutodetectorTests): changes, "app", 0, 0, old_name="field", new_name="renamed_field" ) + def test_foreign_object_from_to_fields_list(self): + author_state = ModelState( + "app", + "Author", + [("id", models.AutoField(primary_key=True))], + ) + book_state = ModelState( + "app", + "Book", + [ + ("id", models.AutoField(primary_key=True)), + ("name", models.CharField()), + ("author_id", models.IntegerField()), + ( + "author", + models.ForeignObject( + "app.Author", + models.CASCADE, + from_fields=["author_id"], + to_fields=["id"], + ), + ), + ], + ) + book_state_copy = copy.deepcopy(book_state) + changes = self.get_changes( + [author_state, book_state], + [author_state, book_state_copy], + ) + self.assertEqual(changes, {}) + def test_rename_foreign_object_fields(self): fields = ("first", "second") renamed_fields = ("first_renamed", "second_renamed") |
