Django 2.x 솔루션 :
Django 2 에서 파일 삭제를 처리하는 것은 매우 쉽습니다 . Django 2 및 SFTP Storage 및 FTP STORAGE를 사용하여 다음 솔루션을 시도해 보았으며 delete
방법 을 구현 한 다른 저장소 관리자와 함께 작동 할 것이라고 확신합니다 . ( delete
방법은 storage
추상적 인 방법 중 하나입니다 .)
delete
인스턴스가 자신을 삭제하기 전에 파일 필드를 삭제하는 방식으로 모델 의 메서드를 재정의합니다 .
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()
삭제 쿼리를 실행 중이기 때문에 발생 합니다. 따라서 메서드 를 사용하여 모델의 파일을 삭제하려면 Custom Manager를 작성하고 사용해야합니다 (삭제 쿼리를 재정의하기 위해).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
했지만 삭제 한 객체 또는 원하는 항목에 대해 반환하면 더 잘 할 수 있습니다.