旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Django] FileFieldのファイルを削除

2013年1月5日

Django-1.4.3のFileFieldを使った場合に、
リンク先のファイルを削除する方法とその存否判定についてです
(FileFieldマニュアル: 日本語 / 英語)

FileFieldに格納した値は、FieldFile(ややこしい)にマップされている

some_model_obj = SomeModel.objects.get(id=1)
print type(some_model_obj.some_file_field)
# -> "<class 'django.db.models.fields.files.FieldFile'>"

削除はdeleteを手動で呼び出して行う

# この時点でファイルが削除
some_model_obj.some_file_field.delete()

ファイルの存否判定はFieldFileオブジェクトをboolへキャスト
(コチラを参考にした)

print bool(some_model_obj.some_file_field) # -> True
some_model_obj.some_file_field.delete()
print bool(some_model_obj.some_file_field) # -> False

モデルオブジェクトを削除した際は同期しない、
マニュアルには「コマンド作って同期したら?」と書いてある

Note that when a model is deleted, related files are not deleted. If you need to cleanup orphaned files, you’ll need to handle it yourself (for instance, with a custom management command that can be run manually or scheduled to run periodically via e.g. cron).

個人的には、安易にタスクを増やすのは好きじゃないんですけども