Django 2.x โซลูชัน:
มันง่ายมากที่จะลบการจัดการไฟล์ในDjango 2 ฉันได้ลองใช้วิธีแก้ปัญหาต่อไปนี้โดยใช้ Django 2 และ SFTP Storage และ FTP STORAGE และฉันค่อนข้างมั่นใจว่ามันจะทำงานร่วมกับผู้จัดการหน่วยเก็บข้อมูลอื่น ๆ ที่ใช้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()
แก้ไข (เพิ่มเติม):
ตามที่@HeyManกล่าวไว้ด้วยการเรียกใช้โซลูชันนี้Song.objects.all().delete()
จะไม่ลบไฟล์! นี้เกิดขึ้นเพราะSong.objects.all().delete()
มีการเรียกใช้แบบสอบถามลบของผู้จัดการเริ่มต้น ดังนั้นหากคุณต้องการลบไฟล์ของโมเดลโดยใช้objects
เมธอดคุณต้องเขียนและใช้Custom Manager (เพียงเพื่อลบล้างคิวรีลบ):
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
แต่คุณสามารถทำได้ดีกว่าโดยส่งคืนบางอย่างเกี่ยวกับวัตถุที่คุณลบไปหรืออะไรก็ได้ที่คุณต้องการ