Giải pháp Django 2.x:
Rất dễ dàng để xử lý việc xóa tệp trong Django 2 . Tôi đã thử giải pháp sau bằng cách sử dụng Django 2 và SFTP Storage cũng như FTP STORAGE và tôi khá chắc chắn rằng nó sẽ hoạt động với bất kỳ trình quản lý lưu trữ nào khác đã triển khai delete
phương pháp. ( delete
method là một trong những storage
method trừu tượng.)
Ghi đè delete
phương thức của mô hình theo cách mà cá thể xóa các Trường tệp của nó trước khi xóa chính 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()
Nó hoạt động khá dễ dàng đối với tôi. Nếu bạn muốn kiểm tra xem tệp có tồn tại trước khi xóa hay không, bạn có thể sử dụng storage.exists
. Ví dụ: self.song.storage.exists(self.song.name)
sẽ trả về boolean
đại diện nếu bài hát tồn tại. Vì vậy, nó sẽ giống như thế này:
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()
CHỈNH SỬA (Ngoài ra):
Như @HeyMan đã đề cập, với giải pháp này, việc gọi Song.objects.all().delete()
không xóa tệp! Điều này đang xảy ra vì Song.objects.all().delete()
đang chạy truy vấn xóa của Trình quản lý mặc định . Vì vậy, nếu bạn muốn có thể xóa tệp của một mô hình bằng objects
các phương pháp, bạn phải viết và sử dụng Trình quản lý tùy chỉnh (chỉ để ghi đè truy vấn xóa của nó):
class CustomManager(models.Manager):
def delete(self):
for obj in self.get_queryset():
obj.delete()
và để gán CustomManager
cho mô hình, bạn phải viết tắt objects
bên trong mô hình của mình:
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()
Bây giờ bạn có thể sử dụng .delete()
ở cuối bất kỳ objects
truy vấn phụ nào . Tôi đã viết đơn giản nhất CustomManager
, nhưng bạn có thể làm điều đó tốt hơn bằng cách trả lại một cái gì đó về các đối tượng bạn đã xóa hoặc bất cứ thứ gì bạn muốn.