import os from django.utils.deconstruct import deconstructible @deconstructible class DynamicUploadTo: def __init__(self, prefix, field_name): self.prefix = prefix self.field_name = field_name def __call__(self, instance, filename): ext = filename.split('.')[-1] fname = self.field_name(instance) if callable(self.field_name) else self.field_name if self.prefix == "user": filename = f"{instance.nickname}-{fname}.{ext}" else: filename = f"{instance.id}-{fname}.{ext}" return os.path.join(self.prefix, filename) def file_delete(obj, field): getattr(obj, field).delete(save=False) setattr(obj, field, None) obj.save(update_fields=[field])