Django 2.xソリューション:
これは、ファイルの削除を処理するために非常に簡単ですジャンゴ2。Django2とSFTPStorage、さらにFTP STORAGEを使用して次のソリューションを試しましたが、delete
メソッドを実装した他のストレージマネージャーで動作すると確信しています。(delete
メソッドはstorage
抽象的なメソッドの1つです。)
delete
インスタンスが自身を削除する前にFileFieldsを削除するように、モデルのメソッドをオーバーライドします。
class Song(models.Model):
name = models.CharField(blank=True, max_length=100)
author = models.ForeignKey(User, to_field='id', related_name="id_user2")
song = models.FileField(upload_to='/songs/')
image = models.ImageField(upload_to='/pictures/', blank=True)
date_upload = models.DateField(auto_now_add=True)
def delete(self, using=None, keep_parents=False):
self.song.storage.delete(self.song.name)
self.image.storage.delete(self.song.name)
super().delete()
それは私にとってかなり簡単に動作します。削除する前にファイルが存在するかどうかを確認したい場合は、を使用できますstorage.exists
。たとえば、曲が存在する場合は表現self.song.storage.exists(self.song.name)
を返しboolean
ます。したがって、次のようになります。
def delete(self, using=None, keep_parents=False):
storage = self.song.storage
if storage.exists(self.song.name):
storage.delete(self.song.name)
if storage.exists(self.image.name):
storage.delete(self.song.name)
super().delete()
編集(追加):
以下のよう@HeyManが述べたように、このソリューションの呼び出しでSong.objects.all().delete()
ファイルを削除しません!これは、何が起こっているSong.objects.all().delete()
の削除クエリ実行されているデフォルトのマネージャーを。したがって、objects
メソッドを使用してモデルのファイルを削除できるようにする場合は、カスタムマネージャーを作成して使用する必要があります(削除クエリをオーバーライドするためだけに)。
class CustomManager(models.Manager):
def delete(self):
for obj in self.get_queryset():
obj.delete()
CustomManager
モデルにを割り当てるには、モデルobjects
内で初期化する必要があります。
class Song(models.Model):
name = models.CharField(blank=True, max_length=100)
author = models.ForeignKey(User, to_field='id', related_name="id_user2")
song = models.FileField(upload_to='/songs/')
image = models.ImageField(upload_to='/pictures/', blank=True)
date_upload = models.DateField(auto_now_add=True)
objects = CustomManager()
def delete(self, using=None, keep_parents=False):
self.song.storage.delete(self.song.name)
self.image.storage.delete(self.song.name)
super().delete()
これ.delete()
で、objects
サブクエリの最後に使用できます。私は最も単純なものを書きましたが、CustomManager
削除したオブジェクトや必要なものについて何かを返すことで、より適切に行うことができます。