Django中的文件上传:阻止FileField写入数据库的完整路径

时间:2009-05-28 10:57:36

标签: django

我正在Django框架之上构建一个软件存储库。因为它将包含大量文件,所以我希望它在通过文件管理器查看时有所帮助。所以我首先按照他们所属程序的URL对文件进行分组,然后按该URL的前两个字母进行分组。这是它的外观:

screenshot of my directory structure

架构如下所示:

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写入数据库的内容以及它在加载原始字段后如何重建路径?

1 个答案:

答案 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'

但它应该以'./'

开头

FileField-Reference

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)