Django-Storages изменить ведро s3 на существующем объекте

У меня есть приложение django, которое позволяет загружать файлы в ведро S3 с помощью django-storages. Файл предназначен для детали, которую нужно утвердить. После утверждения я хотел бы переместить файл в другое ведро 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" не сработает, поскольку она ожидает фактический файл. Я читал, что должен иметь возможность обновить url с помощью myObject.file.url = "newbucketaddress/myfile.txt", но я получаю ошибку AttributeError: can't set attribute.

Есть ли способ в django-storages с s3 обновить существующий файл s3 bucket?

Возможно, вам придется вручную проложить путь к новому ведру. Документация 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, иначе он будет использовать хранилище по умолчанию в настройках, если оно было назначено. После копирования файла в новое хранилище я удаляю старый файл и изменяю file = null так, чтобы только approved_file содержал объект s3.

Вернуться на верх