【问题标题】:Override delete-function on multi-delete覆盖多重删除的删除功能
【发布时间】:2010-01-13 22:25:36
【问题描述】:

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

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

【问题讨论】:

  • 这段代码有异味。我建议不要使用它。
  • @Ignacio - 请扩展
  • 在多处理情况下,一个连接可能会删除相册中的最后一张照片,而另一个连接正在将照片上传到该相册。由于没有看到创建目录的代码,因此不可能对这段代码的活跃程度有深刻的理解,但我不会冒险在我的服务器上运行。
  • 之前有人问过这个问题:stackoverflow.com/questions/1471909/…

标签: python django


【解决方案1】:

解决了我的问题:)

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

【讨论】:

    【解决方案2】:

    为了完整起见,模型的 delete 方法不会在 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

    【讨论】:

      【解决方案3】:

      使用多选和删除时 一次多个项目

      我怀疑这意味着你正在做类似的事情:

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

      如果是这样,那将不会调用您的自定义 delete 方法,因为它在查询集上使用 delete 方法。虽然效率不高,但您可以强制通过以下方式调用您的删除方法:

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

      【讨论】:

      • 我将尝试覆盖查询集删除方法并使用它来运行我的自定义删除功能。
      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 2022-01-23
      • 1970-01-01
      • 2020-06-07
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多