2016-01-30 1 views
3

У меня есть следующая модель.django: вызов delete на объекте не удаляет файл

class StoreSegments01(models.Model): 
    segment = models.FileField(upload_to=content_file_name) 
    segmentID = models.TextField(max_length=100, default=11) 

class StoreSegments01Form(forms.ModelForm): 
    class Meta: 
    model = StoreSegments01 
    fields = ['segment', 'segmentID'] 

def content_file_name(instance, filename): 
    return '{0}'.format(instance.segmentID) 

Я хочу предоставить пользователям возможность удалять их файлы. В manage.py оболочки я попробовать следующее:

obj = StoreSegments01.objects.get(segmentID='239fd363-562a-41b3-a915-b7a84cc4a172') 
>>> obj.delete() 

Он удаляет запись, относящуюся к указанному segmentID, но файл, связанный с идентификатором еще есть. Я пробовал то же самое с запросом, но файл не удаляется.

Что мне здесь не хватает?

+0

Возможный дубликат [Как получить Django Admin для удаления файлов при удалении объекта из базы данных/модели?] (Http://stackoverflow.com/questions/5372934/how-do-i-get-django -admin-to-delete-files-when-i-remove-an-object-from-the-datab) – Variant

+0

@Variant Должен ли я идти с сигналами? – Miind

+0

Или просто установите 'pip install django-cleanup' в качестве одного из ответов: – Ramast

ответ

3

Вот альтернатива использованию сигналов: переопределите метод delete вашей модели.

Пример:

class StoreSegments01(models.Model): 
    segment = models.FileField(upload_to=content_file_name) 
    segmentID = models.TextField(max_length=100, default=11) 

    def delete(self, *args, **kwargs): 
     # first, delete the file 
     self.segment.delete(save=False) 

     # now, delete the object 
     super(StoreSegments01, self).delete(*args, **kwargs) 

Для Python 3, вызовите super так: super().delete(*args, **kwargs)

Heads Up! : Это работает, если вы удаляете отдельные объекты. Но если вы удаляете объекты массово, связанные файлы не удаляются. Поскольку удаление одного объекта вызывает метод model.delete(), но удаление массовых вызовов queryset.delete(). Спасибо Håken Lid, который указал на это ниже.

+1

Вместо переопределения метода delete()' вы можете использовать 'django.db.models.signals.pre_delete'. Сигналы будут слушать как model.delete(), так и queryset.delete(). Документы: https://docs.djangoproject.com/en/1.9/topics/signals/ –

+0

@ HåkenLid Эй, спасибо. Теперь я понимаю, почему файлы не удаляются с помощью массового удаления. – xyres

+0

Вы сделали мой день, многие из вас, это было очень просто: D 'self.segment.delete (save = False)', а также 'super (self .__ class__, self) .delete (* args, ** kwargs) ' –

Смежные вопросы