Вы можете определить pre_save
приемник в моделях:
@receiver(models.signals.pre_save, sender=UserAccount)
def delete_file_on_change_extension(sender, instance, **kwargs):
if instance.pk:
try:
old_avatar = UserAccount.objects.get(pk=instance.pk).avatar
except UserAccount.DoesNotExist:
return
else:
new_avatar = instance.avatar
if old_avatar and old_avatar.url != new_avatar.url:
old_avatar.delete(save=False)
У моих аватаров есть уникальный URL для каждого человека, например, "avatars / ceb47779-8833-4719-8711-6f4e5cabb2b2.png". Если пользователь загружает новое изображение с другим расширением, например jpg, приемник delete_file_on_change_extension удаляет старое изображение, а затем сохраняет новое с помощью URL-адреса "avatars / ceb47779-8833-4719-8711-6f4e5cabb2b2.jpg" (в данном случае). Если пользователь загружает новое изображение с тем же расширением, django перезаписывает старое изображение в хранилище (на диске), поскольку пути к изображениям совпадают.
Это прекрасно работает с AWS S3 django-storage.