Django Случайная проблема с FileField при удалении - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть проект, куда я загружаю файлы со случайным именем файла

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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...