Django 2.x Çözümü:
Django 2'de dosya silme işlemini gerçekleştirmek çok kolaydır . Django 2 ve SFTP Depolama ve ayrıca FTP DEPOLAMA kullanarak aşağıdaki çözümü denedim ve deleteyöntemi uygulayan diğer depolama yöneticileriyle çalışacağından oldukça eminim . ( deleteyöntem storagesoyut yöntemlerden biridir.)
deleteModelin yöntemini, örneğin kendisini silmeden önce FileFields'ı sileceği şekilde geçersiz kılın :
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()
Benim için oldukça kolay çalışıyor. Silme işleminden önce dosyanın var olup olmadığını kontrol etmek isterseniz kullanabilirsiniz storage.exists. örneğin şarkı varsa self.song.storage.exists(self.song.name)bir booleantemsilci döndürecektir . Yani şöyle görünecek:
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()
DÜZENLE (Ek olarak):
As @HeyMan bahsedildiği, bu çözüm arama ile Song.objects.all().delete()dosyaları silmez! Bunun nedeni Song.objects.all().delete(), Varsayılan Yöneticinin silme sorgusunu çalıştırmasıdır . Bu nedenle objects, yöntemleri kullanarak bir modelin dosyalarını silebilmek istiyorsanız, bir Özel Yönetici yazmalı ve kullanmalısınız (sadece silme sorgusunu geçersiz kılmak için):
class CustomManager(models.Manager):
def delete(self):
for obj in self.get_queryset():
obj.delete()
ve CustomManagermodele atamak için, modelinizin objectsiçinde baş harfleri almanız gerekir :
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()
Artık .delete()herhangi bir objectsalt sorgunun sonunda kullanabilirsiniz . En basitini yazdım CustomManager, ancak sildiğiniz nesneler veya ne isterseniz onu geri getirerek daha iyisini yapabilirsiniz.