Python Django呼び出しpost_delete()カスタム削除

1346 ワード

最近、アップロードされたファイルがdjangoが持参したFileFieldで保存されていないため、オブジェクトを削除する際にviewsにコードを追加して関連するファイルを削除する必要があるという項目がある.調べてみるとdjangoではpost_削除動作をカスタマイズします.サンプルコードは次のとおりです.
$ mkdir mysite
$ cd mysite/
$ virtualenv --python=python3.6 venv
$ source venv/bin/activate
$ pip install django
$ python -m django startproject mysite .
$ python manage.py startapp blog
$ vim blog/models.py 
$ cat blog/models.py
from django.conf import settings
from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.contrib.auth.models import User


class Article(models.Model):
    title = models.CharField(max_length=80)
    text = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    attach = models.CharField(max_length=255)    #                


@receiver(post_delete, sender=Article)
def delete_upload_files(sender, instance, **kwargs):
        files = getattr(instance, 'attach', '')
        if not files:
            return 
        fname = os.path.join(settings.MEDIA_ROOT, files)
        if os.path.isfile(fname):
            os.remove(fname)
$ echo "MEDIA_URL = '/media/'" >> mysite/settings.py 
$ echo "MEDIA_ROOT = os.path.join(BASE_DIR, 'media')" >> mysite/settings.py

だいたいこれくらいです