通常的做法
在上传图片方面,Django 有分别给我们提供 ImageField 字段:
https://docs.djangoproject.com/en/2.2/ref/models/fields/#imagefield
而在上传视频文件方面,或许你会想既然有了 ImageField 了,那么应该会 ViddeoField 吧,很抱歉,这个真没有,但是通常有个一个方法就是用 FileField 字段,顾名思义,这个是文件字段,视频本身也是一种文件,所以可以用它来上传视频文件:
https://docs.djangoproject.com/en/2.2/ref/models/fields/#filefield
当你用了上面的两个字段,你通常还要设置媒体文件路径,当部署上线把调试改为False后,还要在路由上做一些设置,不然媒体文件加载不出来。有时候你做了这些设置的后,还是显示不错,就问你气不气。还有一个问题是当你上传大的图片、文件时,会出现上传不了的问题。那么问题来了:有没有一种方法可以完美的解决上面的这些问题,一不做媒体文件设置,二不用怕上传不了大的文件?
优雅的做法
只要你注意到,用了上面两个字段,在数据库中存储的只是图片、文件的 url 路径,竟然只存储 url 路径,那么我们可以把我们想要上传的图片、视频文件保存到其他第三方对象存储平台,当上传后只保存其链接。所以当要用到图片、视频文件时,我们可以用一个叫 URLField 字段:
https://docs.djangoproject.com/en/2.2/ref/models/fields/#urlfield
当你用了 URLField 字段后,我们就可以把想要上传的媒体文件上传到其他的云存储平台,然后我们的数据只保存文件其对应的链接。你想想看,前面需要我们做的一些媒体路径设置是因为我们把相关的文件保存在当前的开发环境中了,Django 本身不是为处理媒体文件而生的,这不是它的强项,所以它需要把本地的媒体文件加载处理得需要做一些设置。现在把媒体文件存存储到第三方对象存储平台上,这些设置就可以不用设置了。
那么问题又来了:怎样把媒体文件保存到第三方对象存储平台上?
这里推荐七牛云,为什么推荐它:免费测试。很多对象存储平台需要你有自己的域名等等一些限制。这里我觉得不需要我写 Django 如何结合七牛云了,因为网上很多优秀的博主早已写了相关的教程,只要你舍得去搜索,就会有相关的教程。