CloudStorageと連携しているDjangoのアプリケーション内で、レコードを削除したときに一緒にストレージ内のファイルも削除する方法をご紹介します。
問題
DjangoアプリケーションをGAEにデプロイしCloudSQLと連携した際に、データベース上のメディアファイルを正常に表示させることが出来ず、CloudStorageにメディアファイルをアップロードすることで解決する、という記事を過去にご紹介させていただきました。
これで無事に画像を表示させることができました。
しかし、アプリケーション内でレコードを削除しても、CloudStorage(バケット)内にはメディアファイルが残ったまま、という問題がありました。
具体的にはこんな感じです。
アプリケーション上で削除を行います。
バケットには依然として画像ファイルが残っています。
アプリケーションで削除を行った際に、同時にバケット内のファイルも削除されるようにしていきます。
実装する
models.py で項目を下記のように定義しているとします。
from django.db import models
class HogeModel(models.Model):
"""モデルの定義"""
image = models.ImageField(verbose_name='写真')
def __str__(self):
return self.image.name
バケット内のファイルも同時に削除させるためには下記のように編集します。
from django.db import models
from django.dispatch import receiver
from google.cloud import exceptions
class HogeModel(models.Model):
"""モデルの定義"""
myimage = models.ImageField(verbose_name='写真')
def __str__(self):
return self.image.name
@receiver(models.signals.post_delete, sender=HogeModel)
def auto_delete_image(sender, instance, **kwargs):
file = instance.myimage
try:
file.storage.delete(name=file.name)
except exceptions.NotFound as e:
print(e)
レコード削除時に実行される関数をデコレータを使用して定義することで実現しています。
バケット内に指定したファイルが無い場合はエラーが発生するので、try-except文を使用しています。
まとめ
だいぶニッチな内容かと思いますが、助けになれば幸いです。
ご覧いただきありがとうございました!
※参考にさせていただいた記事です。ありがとうございます。
コメント
コメント一覧 (1件)
[…] 【Django】レコード削除した際にCloudStorageでも削除するように […]