【Django】レコード削除した際にCloudStorageでも削除するように

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、2日だけできる仕事ないかな、、、」

「ある程度スキルが身に付いてはきたけど、そのスキルを活用できる場が欲しい」

なんて悩みが以前はありました。

自分で仕事を探しに行くのも大事ですが、蛇の道は蛇。その道の人に頼むことで、自分だけでは見つからないような案件に携わることができます。

IT PRO パートナーズでは、簡単に無料でアカウントを登録でき、さらにはエージェントさんに希望の働き方・案件の種類を提示することでお仕事を紹介してくれます!

登録自体も非常に簡単で、「エージェントさんとの面談を希望する」という欄にチェックをするだけで、エージェントさんから直接連絡をいただくことができます。

驚くほど簡単で正直拍子抜けしてしまいました笑

もしお仕事探しに困っておりましたら、一度登録し案件を眺めてみることをおすすめします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

勤めていた設計会社を退社し、フリーランスとして活動しています
また、趣味で主にpyhonを用いて機械学習を行なっています!
現在競艇の予測モデルの開発中です。

コメント

コメント一覧 (1件)

コメントする

目次