【问题标题】:Storing File in Json Field, Django将文件存储在 Json 字段中,Django
【发布时间】:2020-10-30 16:08:21
【问题描述】:
我正在做一个需要用户提交各种形式的帖子的项目。
有些帖子需要图片,有些帖子需要视频。为了处理这个和其他复杂性,我正在考虑使用jsonfields。
我当前的问题是处理文件,即图像和视频。我希望能够将文件 url 存储在 json 字段中的一个字段中,但我在互联网上没有遇到过这样的事情。
继续采用这种方法是否可行或可取?如果可以,怎么做?
【问题讨论】:
标签:
python
django
api
django-rest-framework
django-jsonfield
【解决方案1】:
您可以使用 Django 的 FileField https://docs.djangoproject.com/en/3.1/ref/models/fields/#filefield 与 django-rest-framework 配合使用。它完全按照您的预期工作(即返回保存文件的 URL)。
我更喜欢通过来自django-storages 的S3Boto3Storage 使用S3 作为存储。您可以定义一个自定义存储,如
class MyCustomStorage(S3Boto3Storage):
location = 'private'
default_acl = 'private'
file_overwrite = False
custom_domain = False
然后在你的模型中:
class MyModel(models.Model):
...more fields...
attachment = models.FileField(storage=MyCustomStorage(), null=True)
...more fields...
【解决方案2】:
您可以使用类似 S3 的服务来实现 AWS S3 或任何替代方案。
如果您需要本地服务并且不想使用 3 方服务,您可以查看minio,它可以在任何服务器上本地设置。
思路如下
您设置 minio/s3 服务并将其用作 django 应用程序的媒体存储(查看django-storages)
因此,无论何时创建帖子,您都可以将所有媒体或静态文件上传到 s3,并在您的帖子对象中使用 url。