覆盖删除多重删除功能

问题描述:

以下方法在转到对象adminpage并选择删除时效果很好。问题是,当使用multiselect并一次删除多个项目时,它不会使用我的delete-override。覆盖删除多重删除功能

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

这段代码闻起来很活泼。我建议不要使用它。 – 2010-01-13 22:29:49

+0

@Ignacio - 请展开 – czarchaic 2010-01-13 22:35:02

+1

在多处理情况下,一个连接可能会删除相册中的最后一张照片,而另一个连接正在将照片上传到该相册。没有看到创建目录的代码,我们不可能深刻理解这段代码是多么的活泼,但我不会冒着在我的服务器上运行的风险。 – 2010-01-13 22:41:19

解决我的问题:)

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

使用多选,并在一次

我删除 多个项目时),我一直在寻找一个解决方案,但还没有找到一个这么是时候轮到主人怀疑这意味着你做这样的事情:

Photo.objects.filter(name='something').delete() 

如果是这样的话,不会调用定制delete方法,因为它使用了delete方法在查询集上。虽然不是非常有效的,可以强制你的删除方法被调用:

for photo in Photo.objects.filter(name='something'): 
    photo.delete() 
+0

我会尝试重写queryset delete-method并使用它来运行我的自定义删除函数。 – xintron 2010-01-14 08:32:03

只是为了保持完整性,模型的删除方法不叫上一型号.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