Django upload_to 在 MEDIA_ROOT 外部使用

33 投票
2 回答
12806 浏览
提问于 2025-04-15 15:58

我的部署脚本会覆盖媒体和源目录,这意味着我必须把上传的目录从媒体目录中移出去,然后在上传完成后再放回去。

我该怎么告诉Django把文件上传到/uploads/而不是/media/呢?

到目前为止,我一直收到Django的可疑操作错误! :(

我想另一个解决办法可能是使用符号链接?

非常感谢,

Toby。

2 个回答

3

虽然被接受的答案可能是你想要的,但现在在 django 3.1 中,我们可以选择在运行时决定使用哪个存储方式,只需要把一个函数传递给 ImageFieldFileField 的存储参数就可以了。

def select_storage():
    return MyLocalStorage() if settings.DEBUG else MyRemoteStorage()


class MyModel(models.Model):
    my_file = models.FileField(storage=select_storage)

可以看看官方的 文档

请注意,目前被接受的答案会把变量 UPLOAD_ROOT 的实际值写入迁移文件。当你把它应用到数据库时,这不会产生任何 SQL 语句,但如果你频繁更改这个设置,可能会让人感到困惑。

63

我做了以下操作:

from django.core.files.storage import FileSystemStorage

upload_storage = FileSystemStorage(location=UPLOAD_ROOT, base_url='/uploads')

image = models.ImageField(upload_to='/images', storage=upload_storage) 

UPLOAD_ROOT 是在我的 settings.py 文件中定义的,路径是:/foo/bar/webfolder/uploads

撰写回答