Django Storages更改现有对象上的s3 bucket



我有一个django应用程序,它允许使用django存储将文件上传到S3存储桶。该文件用于需要批准的零件。一旦获得批准,我想将文件移到另一个S3存储桶中。

class DesignData(models.Model):
file = models.FileField(storage=PublicMediaStorage())
...
class PublicMediaStorage(S3Boto3Storage):
location = "media"
default_acl = "public-read"
file_overwrite = False

批准后,我使用将文件复制到新的存储桶中

client.copy_object(
Bucket=settings.AWS_APPROVED_STORAGE_BUCKET_NAME,
CopySource=copy_source,
Key=design_data["s3key"],
)

文件被正确移动,但是我需要更新我的对象。如何更新对象?尝试像myObject.file = "newbucket/myfile.txt"这样的东西不会起作用,因为它需要一个实际的文件。我已经读到我应该能够用myObject.file.url = "newbucketaddress/myfile.txt"更新url,但我得到了一个错误AttributeError: can't set attribute

在使用s3的django存储中,有没有一种方法可以更新现有的文件s3存储桶?

您可能需要手动构建到新bucket的路径。Boto3文档将为您提供指导。

获取bucket的位置、名称和对象密钥。您可以构建到对象的路径

我最终使用了某种变通方法来解决我的问题。我最终更改了我的模型,以包含另一个文件,该文件将存储新的s3存储桶位置。

class DesignData(models.Model):
file = models.FileField(storage=PublicMediaStorage())
approved_file = models.FileField(storage=ApprovedPublicMediaStorage())

我添加了ApprovedPublicMediaStorage((:

class PublicMediaStorage(S3Boto3Storage):
location = "media"
default_acl = "public-read"
file_overwrite = False
custom_domain = "newbucketlocation0.s3...."

我确实通过艰苦的方式学习了,所以请确保包括custom_domain,否则如果已经分配了它,它将在设置中使用default_storage。将文件复制到新的存储后,我删除旧文件并更改file = null,以便只有approved_file包含s3对象。

最新更新