Here’s a conundrum: what if I want most files to not overwrite in S3, but I want some specific files to be unique and keep their naming? If we enable file_overwrite, all images will keep their name, but if we disable it, then all will be renamed. We might have a parent entity PE1
with a main image, and we want that image to be named PE1-main_image.jpg
. How can we achieve that logic only for specific images? The answer is very simple.
During processing, rename your file accordingly.
In your custom storage, set file_overwrite = False and overwrite the get_available_name function:
from storages.backends.s3boto3 import S3Boto3Storage
from storages.utils import get_available_overwrite_name
from web.utils import name_meets_condition
class MediaStorage(S3Boto3Storage):
location = 'media'
default_acl = 'public-read'
file_overwrite = False
def get_available_name(self, name, max_length=None):
name = self._clean_name(name)
if name_meets_condition(name): # e.g. name.startswith('PE')
return get_available_overwrite_name(name, max_length)
return super().get_available_name(name, max_length)