【django】モデルのフィールドに登録されたの画像ファイルを削除する

djangoでモデルのフィールドに登録された画像のファイルを、viewsのdelete()を使用してもインスタンスに保存されているファイルは削除できません。

そうは問屋が卸さないのです。

そしてそのままスルーしたらどんどんゴミデータとして積もり積もってしまいます。

そんな時のファイルの削除の解決方法を紹介します。

こんな人向け

・モデルのフィールドにある画像を削除しようとしているのに削除できない

環境

・OS : Mac

・django 2.2

・python 3.8

それでは順番に説明をしていきます。

削除できない事象に遭遇する例とクラスモデル

そもそもの今回のような事象に遭遇する例をモデルクラスと共に説明します。

デフォルトUserに、アバター画像と誕生日の追加をしたく新しくUserProfileというモデルクラスを作成しました。

ちなみにuser_idでリレーションを張っています。

models.py

viewsで削除できない

実際にviewsで書いたコードはこちらです(UpLoadProfileImgFormは割愛します)。

手順としては新しくプロフィールのアバター画像を変更したいので、13行目で既にプロフィールアバターがあるなら、14行目でそれを削除しますよ。という手順です。

views.py

新たにプロフィール画像を18行目で保存するのに、前のuser_idと同じ番号を持つavatorが存在するのは宜しくないですよね。

またこれ以外の理由としても画像をきちんと削除しておかないとゴミデータとしてどんどん積もり積もってしまうからです。

解決方法

解決方法としてはFileFieldに登録されたファイルを削除する事になりますが、方法を2つ紹介します。

views側からパス指定で削除

views側でdelete()するときにパス指定で削除実行のコードを追加します。

こちらになりますが、先ほどのviewsに入れ込みます。

単純にremoveメソッドにパスを与えてあげれば良いのです。

ちなみに

settings.py

ここのパスは人それぞれかと思いますので調べて設定してください。

それでは先ほどのコードに追記した全体像がこちらになります。

15行目に追記しました。

views.py

modelsにデコレーターを設定

models.py

1行目の from django.db.models.signals import post_delete の post_delete ですがこちらはviews側のdelete()メソッドの処理の最後に呼び出されます。

5行目のsenderにはモデルクラスを指定します。

全体像としてはこうなります。

models.py

※参考 https://docs.djangoproject.com/ja/2.1/topics/signals/


スクールを利用して本格的に学ぶ

いかがでしたでしょうか?

10人中9人が挫折すると言われるプログラミングを、ヒロヤンも実はプログラミングスクールで学習をしてきたからで、結果、今はPythonエンジニアとして働いています。

挫折率が高いプログラミングこそお金を払ってメンターを付けて、道を見失わないように環境を構築する必要があるのではないでしょうか。

これはダイエットで自分一人では痩せられないけど、トレーナーを付けて否が応でもせざるを得ない環境を作ると一緒ですね。

ヒロヤンもプログラミング勉強開始直後はあれこれ悩みましたが、悩むよりも手っ取り早くスクールに登録した方が最短ルートで勉強できるのではないかと考え、結果挫折せずに今に至っています。

今なら無料でキャリアカウンセリングを行っているTechAcademyのようなプログラミングスクールもありますのでこれを機会に是非カウンセリングだけでも受けてみてはいかがでしょうか?

TechAcademyで無料のカウンセリング

上記リンク先から無料相談ができます。

またこちら(↓)ではPython専用のプログラミングスクールをまとめ紹介しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です