お気づきかもしれませんが、s3 には create、copy、delete メソッドしかありません。したがって、名前を変更する関数を実装する必要があります: copy-with-new-name & delete-old. 次に、モデルの保存メソッドを再定義するか、そのモデルにdjangoシグナルを実装することにより、この関数を配置できます。
擬似コード:
def rename_s3(old_key, new_key):
s3.copy(old_key, new_key)
s3.delete(old_key)
def rename_multiple(dict_of_keys):
for old_key, new_key in dict_of_keys:
rename_s3(old_key, new_key)
正確には思い出せませんが、コピーの実際のコードは次のようになります。
from boto3.session import Session
session = Session(aws_access_key_id="X", aws_secret_access_key="Y")
s3 = session.resource('s3')
source_bucket = s3.Bucket("bucket-A")
target_bucket = s3.Bucket("bucket-B") # this can be "bucket-A" if you want to copy it in the same bucket
old_key = "path/to/old/file/my.csv"
new_key = "path/to/new/file/my_new_name.csv"
target_bucket.copy(Key= new_key, CopySource={"Bucket": "bucket-A", "Key": old_key})
上記のソリューションには、異なるアカウントに属するバケット間でファイルをコピーできるという利点があります (アカウント B がアカウント A への読み取りアクセス権を持っている場合)。
S3.Client.copy を使用して高速コピーを使用することもできますが、異なるリージョン間でのファイルのコピーはサポートされていないことに注意してください (ドキュメントの注)。
いくつかの素敵なリンク:
Boto3 Docs 1.13.21 ドキュメント (S3.Bucket.copy)
Boto3 Docs 1.13.21 ドキュメント (S3.Client.copy)
ファイルのコピーに関するサンプル チュートリアル