| 2 | |
| 3 | I tried to alter self pointing field and with the changes below its working as expected for the above issue and passing all the tests as well. |
| 4 | |
| 5 | {{{#!diff |
| 6 | diff --git a/django/db/backends/sqlite3/schema.py b/django/db/backends/sqlite3/schema.py |
| 7 | index 88fa466f79..970820827e 100644 |
| 8 | --- a/django/db/backends/sqlite3/schema.py |
| 9 | +++ b/django/db/backends/sqlite3/schema.py |
| 10 | @@ -174,7 +174,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): |
| 11 | super().alter_field(model, old_field, new_field, strict=strict) |
| 12 | |
| 13 | def _remake_table( |
| 14 | - self, model, create_field=None, delete_field=None, alter_field=None |
| 15 | + self, model, create_field=None, delete_field=None, alter_field=None, alter_self_field=None |
| 16 | ): |
| 17 | """ |
| 18 | Shortcut to transform a model from old_model into new_model |
| 19 | @@ -236,6 +236,16 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): |
| 20 | mapping[create_field.column] = self.prepare_default( |
| 21 | self.effective_default(create_field), |
| 22 | ) |
| 23 | + |
| 24 | + # Alter field pointing to the model itself. |
| 25 | + if alter_self_field: |
| 26 | + old_self_field, new_self_field = alter_self_field |
| 27 | + body.pop(old_self_field.name, None) |
| 28 | + mapping.pop(old_self_field.column, None) |
| 29 | + body[new_self_field.name] = new_self_field |
| 30 | + mapping[new_self_field.column] = self.quote_name(old_self_field.column) |
| 31 | + rename_mapping[old_self_field.name] = new_self_field.name |
| 32 | + |
| 33 | # Add in any altered fields |
| 34 | if alter_field: |
| 35 | old_field, new_field = alter_field |
| 36 | @@ -507,6 +517,14 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): |
| 37 | new_field.m2m_reverse_field_name() |
| 38 | ), |
| 39 | ), |
| 40 | + alter_self_field=( |
| 41 | + old_field.remote_field.through._meta.get_field( |
| 42 | + old_field.m2m_field_name() |
| 43 | + ), |
| 44 | + new_field.remote_field.through._meta.get_field( |
| 45 | + new_field.m2m_field_name() |
| 46 | + ), |
| 47 | + ), |
| 48 | ) |
| 49 | return |
| 50 | }}} |