Django-Storages 更改现有对象上的 s3 存储桶
Django-Storages change s3 bucket on existing object
我有一个 django 应用程序,它允许使用 django-storages 将文件上传到 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-storages 中是否有更新现有文件 s3 存储桶的方法?
您可能必须手动构建新存储桶的路径。 Boto3 文档将为您提供指导。
获取存储桶位置、名称和对象键。您可以构建对象的路径
我最终使用了一些变通方法来解决我的问题。我最终更改了我的模型以包含另一个文件,该文件将存储新的 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 对象。
我有一个 django 应用程序,它允许使用 django-storages 将文件上传到 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-storages 中是否有更新现有文件 s3 存储桶的方法?
您可能必须手动构建新存储桶的路径。 Boto3 文档将为您提供指导。
获取存储桶位置、名称和对象键。您可以构建对象的路径
我最终使用了一些变通方法来解决我的问题。我最终更改了我的模型以包含另一个文件,该文件将存储新的 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 对象。