Django 2.x समाधान:
Django 2 में फ़ाइल विलोपन को संभालना बहुत आसान है । मैंने Django 2 और SFTP स्टोरेज और FTP स्टोरेज का उपयोग करके निम्नलिखित समाधान की कोशिश की है, और मुझे पूरा यकीन है कि यह किसी भी अन्य स्टोरेज मैनेजर के साथ काम करेगा जिसने delete
पद्धति लागू की थी । ( delete
विधि एक हैstorage
सार विधियों में से एक है।)
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()
EDIT (परिवर्धन में):
जैसा कि @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
, लेकिन आप अपने द्वारा हटाई गई वस्तुओं या आप जो भी चाहते हैं उसके बारे में कुछ वापस करके इसे बेहतर कर सकते हैं।