I disagree on "very readable". The logic forest is hidden by the detail trees. For example, it's hard to see if all required actions are included, because you can't see the list of actions in one screen -- every high-level action is represented by ~10 lines. I think it would look much better along the lines of
```python

    def alter_field(self, model, old_field, new_field, strict=False):
        ... preliminaries ...
        self._del_unique_if_removed(model, old_field, new_field, strict)
        self._del_index_if_removed(model, old_field, new_field, strict)
        self._del_fk(model, old_field, new_field, strict)
        self._del_check_if_changed(model, old_field, new_field, strict)
        self._rename_if_renamed(model, old_field, new_field, strict)
        alterations = filter(None, [
            self._type_change(old_type, new_type),
            self._default_change(old_field, new_field),
            self._nullity_change(old_field, new_field),
        ])
        self._execute_alterations(alterations)
        self._add_unique_if_added(...)
        self._add_index_if_added(...)
        self._change_pk_if_added(...)
        self._add_fk_if_present(...)
        self._add_check_if_needed(...)
```
I haven't dwelled too much on naming these, the names could probably be improved, but I find this much easier to follow then the current method text.