我有一个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对象。