覆盖多删除时的删除功能

时间:2010-01-13 22:25:37

标签: python django

以下内容适用于转到对象管理页面并选择删除。问题是当使用多选和一次删除多个项目时,它不使用我的删除覆盖。我一直在寻找一个解决方案,但没有找到一个,所以是时候转向主人;)

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))     

3 个答案:

答案 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()