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 对象。