我正在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写入数据库的内容以及它在加载原始字段后如何重建路径?
答案 0 :(得分:2)
name = models.FileField(upload_to=get_absolute_url, max_length=255)
upload_to通常看起来像这样
upload_to ='./files'
它将作为./files/your.file存储在db中
和磁盘上的<MEDIA_ROOT>/files/your.file
您可以将upload_to
- 字符串更改为以编程方式最适合您的字符串
upload_to ='./files'+'/subdir'
但它应该以'./'
开头 get_absolute_url()
应返回http://domain.com/sitemedia/files/your.file
修改强>
从文件名中删除路径,你可以在File.save()中执行字符串操作,如
def save(self, force_insert=False, force_update=False):
self.name = self.name[self.name.rfind('/')+1:]
super(File, self).save(force_insert, force_update)