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.