2014-01-17 24 views
0

我正在從表單中刪除相關模型(與django admin幾乎相同),我有一個包含多個圖像的項目,圖像屬於Item(ForeignKey)。 刪除圖像時,我實現了一個post_delete信號刪除縮略圖和圖像/從表單圖像,問題是,在post_delete縮略圖被刪除,但在數據庫映像入口仍然存在:Django easy_thumbnails和post_delete

# Auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete() 

如果我最後添加以下內容,圖像實例也被刪除(預期的行爲):

# Auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete() 
     instance.delete() 

我是否錯過了什麼?刪除實例後不應該發送post_delete信號嗎?爲什麼實例在db中保持不變? 我認爲這與Queryset刪除行爲有關,但我對此持懷疑態度,因爲如果我刪除該信號,那麼ImageModel的實例將被刪除(儘管縮略圖確實保留在數據庫中)。該模型採用的Django打造的ImageField場 介意,而且不容易縮略圖提供的字段:

class ImageModel(models.Model): 
    ... 
    imagefile = models.ImageField(upload_to="properties/%m/%Y") 
    item = models.ForeignKey('app.ItemModel', related_name='images') 
    ... 

上述解決方案(instance.delete())工作,沒有任何問題,只是好奇的行爲。

回答

0

確定了它與添加刪除(保存=假)工作:

# These two auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete(save=False) 
1

您還可以使用django-cleanup,它會自動調用刪除的FileField方法,當你刪除模型。

pip install django-cleanup 

settings.py

INSTALLED_APPS = (
    ... 
    'django_cleanup', # should go after your apps 
) 
+0

可能是非常危險的,原因是他們在文檔說...'Django的清理連接post_init,pre_save,post_save和post_delete信號,信號處理每個模型有一個FileField' – andi