У меня есть проект, куда я загружаю файлы со случайным именем файла
class Exames(models.Model): #models.py
title = models.CharField(max_length=50)
patient = models.ForeignKey(User, on_delete=models.CASCADE)
exame_pdf = models.FileField(upload_to=RandomFileName('exames'))
def __str__(self):
return self.title
def filename(self):
return os.path.basename(self.exame_pdf.name)
Но когда я удаляю объект 'Exames', я хочу, чтобы файл также был удален, поэтому я использовал это кусок кода (он работал до случайного файла)
@receiver(models.signals.post_delete, sender=Exames)
def auto_delete_file_on_delete(sender, instance, **kwargs):
"""
Deletes file from filesystem
when corresponding `Exames` object is deleted.
"""
if instance.exame_pdf:
if os.path.isfile(instance.exame_pdf.path):
os.remove(instance.exame_pdf.path)
@receiver(models.signals.pre_save, sender=Exames)
def auto_delete_file_on_change(sender, instance, **kwargs):
"""
Deletes old file from filesystem
when corresponding `Exames` object is updated
with new file.
"""
if not instance.pk:
return False
try:
old_file = Exames.objects.get(pk=instance.pk).exame_pdf
except Exames.DoesNotExist:
return False
new_file = instance.exame_pdf
if not old_file == new_file:
if os.path.isfile(old_file.path):
os.remove(old_file.path)
Как мне сделать эту работу снова
Класс RandomFileName
import os
import uuid
from django.utils.deconstruct import deconstructible</p>
<p>@deconstructible
class RandomFileName(object):
def <strong>init</strong>(self, path):
self.path = os.path.join(path, "%s%s")</p>
<code>def __call__(self, _, filename):
# @note It's up to the validators to check if it's the correct file type in name or if one even exist.
extension = os.path.splitext(filename)[1]
return self.path % (uuid.uuid4(), extension)
</code>