Переопределить функцию удаления при многократном удалении - PullRequest
0 голосов
/ 14 января 2010

Следующее прекрасно работает при переходе на страницу администрирования объектов и выборе удаления. Проблема в том, что при использовании множественного выбора и одновременного удаления нескольких элементов он не использует мое удаление-переопределение Я искал решение, но не нашел его, поэтому пришло время обратиться к мастерам;)

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 ]

3 голосов
/ 14 января 2010

Решил мою проблему:)

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 голос
/ 12 июля 2012

Просто для полноты метод удаления модели не вызывается при вызове Model.objects.filter (...). Delete (): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.delete

Django отправляет два сигнала, pre_delete и post_delete, после вызова Model.objects.filter (...). Delete (). Больше информации здесь: https://docs.djangoproject.com/en/dev/ref/signals/#pre-delete

0 голосов
/ 14 января 2010

при использовании множественного выбора и удаления несколько предметов одновременно

Я подозреваю, что это означает, что вы делаете что-то вроде:

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

В этом случае ваш пользовательский метод delete не будет вызываться, поскольку он использует метод delete в наборе запросов. Хотя это и не очень эффективно, вы можете заставить ваш метод удаления вызываться:

for photo in Photo.objects.filter(name='something'):
    photo.delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...