Я строю хранилище программного обеспечения поверх фреймворка Django. Поскольку он будет содержать много файлов, я хочу, чтобы он имел какой-то смысл при просмотре через файловый менеджер. Поэтому я сгруппировал файлы сначала по URL-адресу программы, которой они принадлежат, а затем по первым двум буквам этого URL-адреса. Вот как это выглядит:
Схема выглядит следующим образом:
class File(models.Model):
# If called like upload_to, don't put a slash in front of the result
# because we already have one in settings.MEDIA_ROOT
def get_absolute_url(self, filename=None):
return '%sfiles/%s/%s/%s' % ('' if filename else '/',
self.download.url[:2],
self.download.url,
filename or self.name)
name = models.FileField(upload_to=get_absolute_url, max_length=255)
size = models.IntegerField()
title = models.CharField(blank=True, max_length=255)
download = models.ForeignKey('Download', related_name='files')
class Download(models.Model):
url = models.SlugField(unique=True, max_length=255)
title = models.CharField(max_length=255)
Однако есть небольшая проблема: FileField будет хранить весь сгенерированный путь, а не только имя, которого я бы хотел избежать. Есть ли способ переопределить (возможно, в моем собственном классе поля), что FileField записывает в базу данных и как он восстанавливает путь после загрузки необработанного поля?