Skip to content

Commit 2d997ec

Browse files
committed
Avoid unnecessary prompting for a default value on ManyToManyField removals.
1 parent 540b1b7 commit 2d997ec

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

CHANGELOG.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
1.2.1
2+
=====
3+
4+
:release-date: not-released
5+
6+
- Avoid unnecessary prompting for a default value on `ManyToManyField`
7+
removals. (#59)
8+
19
1.2.0
210
=====
311

syzygy/autodetector.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,14 @@ def _generate_added_field(self, app_label, model_name, field_name):
218218
def _generate_removed_field(self, app_label, model_name, field_name):
219219
field = self.from_state.models[app_label, model_name].fields[field_name]
220220
remove_default = field.default
221-
if (remove_default is NOT_PROVIDED and field.null) or getattr(
222-
field, "db_default", NOT_PROVIDED
223-
) is not NOT_PROVIDED:
221+
if (
222+
# Nullable fields will use null if not specified.
223+
(remove_default is NOT_PROVIDED and field.null)
224+
# Fields with a db_default will use the value if not specified.
225+
or getattr(field, "db_default", NOT_PROVIDED) is not NOT_PROVIDED
226+
# Many-to-many fields are not backend by concrete columns.
227+
or field.many_to_many
228+
):
224229
return super()._generate_removed_field(app_label, model_name, field_name)
225230

226231
if remove_default is NOT_PROVIDED:

tests/test_autodetector.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ def test_field_removal(self):
159159
with self.subTest(field=field):
160160
self._test_field_removal(field)
161161

162+
def test_many_to_many_removal(self):
163+
from_model = ModelState(
164+
"tests", "Model", [("field", models.ManyToManyField("self"))]
165+
)
166+
to_model = ModelState("tests", "Model", [])
167+
changes = self.get_changes([from_model], [to_model])["tests"]
168+
self.assertEqual(len(changes), 1)
169+
self.assertEqual(get_migration_stage(changes[0]), Stage.POST_DEPLOY)
170+
self.assertEqual(changes[0].dependencies, [])
171+
self.assertEqual(len(changes[0].operations), 1)
172+
operation = changes[0].operations[0]
173+
self.assertIsInstance(operation, migrations.RemoveField)
174+
162175
def test_nullable_field_removal(self):
163176
"""
164177
No action required if the field is already NULL'able and doesn't have

0 commit comments

Comments
 (0)