По мнению разработчиков Django -- нормально.
Если хочется изменить такое поведение по-быстрому:
from django.db import models
from django.db.models.signals import post_delete
def change_image(post_object):
# функция удаления изображений при их замене на новые
post_object = self
try:
pre_object = post_object.__class__.objects.get(id=post_object.id)
if pre_object.image != post_object.image:
pre_object.image.delete(save=False)
except:
pass
def delete_image(sender, **kwargs):
# функция удаления изображений при удалении объектов
try:
object_ = kwargs.get('instance')
storage, path = object_.image.storage, object_.image.path
storage.delete(path)
except:
pass
class MyModel(models.Model):
# наша модель с картинкой
image = models.ImageField(
upload_to='images/',
)
def save(self, *args, **kwargs):
# вызов change_image при сохранении объекта модели
change_image(post_object=self)
super(Category, self).save(*args, **kwargs)
# прикрепляем функцию delete_image к сигналу post_delete от модели MyModel
post_delete.connect(receiver=delete_image, sender=MyModel)
Думал доработать данный костыль в инвалидную коляску, а именно -- так чтобы название поля модели не имело значения. Например, при изменении и удалении объекта, через цикл прогонять все поля модели, чтобы применять проверки и операции ко всем FileField и ImageField в модели.
По-хорошему же, лучше разобраться с файловыми полями моделей и сделать своё кастомное. Рассматриваемая задача конечно мелочь, но опыт может пригодится.