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.