| | 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 | }}} |