以下内容适用于转到对象管理页面并选择删除。问题是当使用多选和一次删除多个项目时,它不使用我的删除覆盖。我一直在寻找一个解决方案,但没有找到一个,所以是时候转向主人;)
class Photo(models.Model):
name = models.CharField(max_length=256, unique=True)
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to='photos/')
def delete(self):
super(Photo, self).delete()
### Check if the dir is empty, then remove the folder
ph = Photo.objects.filter(album=self.album)
if ph.count() == 0:
rmtree(os.path.join(settings.MEDIA_ROOT, 'photos/' + self.album.slug))
答案 0 :(得分:3)
解决了我的问题:)
class PhotoQuerySet(QuerySet):
def delete(self):
for x in self:
x.delete()
class PhotoManager(models.Manager):
def get_query_set(self):
return PhotoQuerySet(self.model)
class Photo(models.Model):
name = models.CharField(max_length=256, unique=True)
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to='photos/')
objects = PhotoManager()
def delete(self):
os.remove(self.get_thumbnail_name())
os.remove(self.get_medium_name())
super(Photo, self).delete()
答案 1 :(得分:1)
为了完整起见,模型的删除方法不会在Model.objects.filter(...)上调用.delete()调用:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.delete
Django在Model.objects.filter(...)。delete()调用之后发送两个信号,pre_delete和post_delete。更多信息:https://docs.djangoproject.com/en/dev/ref/signals/#pre-delete
答案 2 :(得分:0)
使用多选和删除时 一次多个项目
我怀疑这意味着你正在做类似的事情:
Photo.objects.filter(name='something').delete()
如果是这种情况,则不会调用您的自定义delete
方法,因为它在查询集上使用delete
方法。虽然效率不高,但您可以通过以下方式强制调用delete方法:
for photo in Photo.objects.filter(name='something'):
photo.delete()