'Make AlterField operations, or possibly RemovedField/AddField if alter
isn\'s possible.'

def generate_altered_fields(self):

    for (app_label, model_name, field_name) in sorted(self.old_field_keys.intersection(self.new_field_keys)):
        old_model_name = self.renamed_models.get((app_label, model_name), model_name)
        old_field_name = self.renamed_fields.get((app_label, model_name, field_name), field_name)
        old_field = self.old_apps.get_model(app_label, old_model_name)._meta.get_field(old_field_name)
        new_field = self.new_apps.get_model(app_label, model_name)._meta.get_field(field_name)
        if (hasattr(new_field, 'remote_field') and getattr(new_field.remote_field, 'model', None)):
            rename_key = (new_field.remote_field.model._meta.app_label, new_field.remote_field.model._meta.model_name)
            if (rename_key in self.renamed_models):
                new_field.remote_field.model = old_field.remote_field.model
        if (hasattr(new_field, 'remote_field') and getattr(new_field.remote_field, 'through', None)):
            rename_key = (new_field.remote_field.through._meta.app_label, new_field.remote_field.through._meta.model_name)
            if (rename_key in self.renamed_models):
                new_field.remote_field.through = old_field.remote_field.through
        old_field_dec = self.deep_deconstruct(old_field)
        new_field_dec = self.deep_deconstruct(new_field)
        if (old_field_dec != new_field_dec):
            both_m2m = (old_field.many_to_many and new_field.many_to_many)
            neither_m2m = ((not old_field.many_to_many) and (not new_field.many_to_many))
            if (both_m2m or neither_m2m):
                preserve_default = True
                if (old_field.null and (not new_field.null) and (not new_field.has_default()) and (not new_field.many_to_many)):
                    field = new_field.clone()
                    new_default = self.questioner.ask_not_null_alteration(field_name, model_name)
                    if (new_default is not models.NOT_PROVIDED):
                        field.default = new_default
                        preserve_default = False
                else:
                    field = new_field
                self.add_operation(app_label, operations.AlterField(model_name=model_name, name=field_name, field=field, preserve_default=preserve_default))
            else:
                self._generate_removed_field(app_label, model_name, field_name)
                self._generate_added_field(app_label, model_name, field_name)
