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 delete
yöntemi uygulayan diğer depolama yöneticileriyle çalışacağından oldukça eminim . ( delete
yöntem storage
soyut yöntemlerden biridir.)
delete
Modelin 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 boolean
temsilci 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 CustomManager
modele atamak için, modelinizin objects
iç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 objects
alt sorgunun sonunda kullanabilirsiniz . En basitini yazdım CustomManager
, ancak sildiğiniz nesneler veya ne isterseniz onu geri getirerek daha iyisini yapabilirsiniz.