Python вызов свойства изнутри класса

Я пытаюсь вызвать свойство protocolo на аргументе upload_to нового поля изображения

Я пытаюсь добиться того, чтобы сохраненные изображения использовали пользовательское имя файла.

class biopsia(models.Model):
    paciente = models.CharField(max_length=50)
    creado = models.DateTimeField(auto_now_add=True)
    foto = models.ImageField(upload_to=f'fotos_biopsias/%Y/{protocolo}', blank=True)

    def __str__(self):
        return str(self.protocolo)

    @property
    def protocolo(self):
        return 'BIO' + str(self.creado.year) + '-' + str(biopsia._base_manager.filter(
            creado__year=self.creado.year,
            creado__lt=self.creado
        ).count() + 1)

File "models.py", line 30, in biopsia
    foto = models.ImageField(upload_to=f'fotos_biopsias/%Y/{protocolo}', blank=True)
NameError: name 'protocolo' is not defined 

Я пробовал определить внешний метод для upload_to, но все равно не могу использовать его внутри моего класса

Вы можете следовать официальной документации о том, как использовать функцию как путь для ImageField. По сути, вам нужно определить функцию во внешней области видимости класса Model. Для вашего случая вы можете попробовать следующий код:

def protocolo(instance, filename):
    return f'fotos_biopsias/{timezone.now().year}/BIO' + str(instance.creado.year) + '-' + str(instance.__class__._base_manager.filter(
        creado__year=instance.creado.year,
        creado__lt=instance.creado
    ).count() + 1) + "/" + filename


class biopsia(models.Model):
    paciente = models.CharField(max_length=50)
    creado = models.DateTimeField(auto_now_add=True)
    foto = models.ImageField(upload_to=protocolo, blank=False, null=False)

    def __str__(self):
        foto_path = self.foto.path.split('/')[3:]
        return '/'.join(foto_path)

Честно говоря, это кажется слишком сложным на уровне БД для простого хранения изображений. Если речь идет только о том, как показать изображение по определенному url-пути, вы можете рассмотреть возможность написания представления, которое действует как обертка на этом url-пути для загрузки изображений. Вы можете последовать примеру, приведенному здесь: Django: Обслуживание медиа за пользовательским URL.

Вернуться на верх