summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Mispelon <bmispelon@gmail.com>2021-11-19 21:45:33 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-11-22 06:46:25 +0100
commita0ed3cfad1ac4873ecfd2baebaa2e978e483ba99 (patch)
tree7ef2d63a8486514a1003af81fdbe1a302bbd357e
parenta7e7043c8746933dafce652507d3b821801cdc7d (diff)
Fixed #33305 -- Fixed autodetector crash for ForeignKey with hardcoded "to" attribute.
Co-authored-by: Simon Charette <charette.s@gmail.com>
-rw-r--r--django/db/migrations/autodetector.py2
-rw-r--r--tests/migrations/test_autodetector.py22
2 files changed, 23 insertions, 1 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py
index 97977d72ef..bf9c2acd26 100644
--- a/django/db/migrations/autodetector.py
+++ b/django/db/migrations/autodetector.py
@@ -96,7 +96,7 @@ class MigrationAutodetector:
for name, field in sorted(fields.items()):
deconstruction = self.deep_deconstruct(field)
if field.remote_field and field.remote_field.model:
- del deconstruction[2]['to']
+ deconstruction[2].pop('to', None)
fields_def.append(deconstruction)
return fields_def
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py
index 3b46601145..18055f242b 100644
--- a/tests/migrations/test_autodetector.py
+++ b/tests/migrations/test_autodetector.py
@@ -2834,6 +2834,28 @@ class AutodetectorTests(TestCase):
expected_number,
)
+ def test_add_custom_fk_with_hardcoded_to(self):
+ class HardcodedForeignKey(models.ForeignKey):
+ def __init__(self, *args, **kwargs):
+ kwargs['to'] = 'testapp.Author'
+ super().__init__(*args, **kwargs)
+
+ def deconstruct(self):
+ name, path, args, kwargs = super().deconstruct()
+ del kwargs['to']
+ return name, path, args, kwargs
+
+ book_hardcoded_fk_to = ModelState('testapp', 'Book', [
+ ('author', HardcodedForeignKey(on_delete=models.CASCADE)),
+ ])
+ changes = self.get_changes(
+ [self.author_empty],
+ [self.author_empty, book_hardcoded_fk_to],
+ )
+ self.assertNumberMigrations(changes, 'testapp', 1)
+ self.assertOperationTypes(changes, 'testapp', 0, ['CreateModel'])
+ self.assertOperationAttributes(changes, 'testapp', 0, 0, name='Book')
+
class MigrationSuggestNameTests(SimpleTestCase):
def test_no_operations(self):