首页 > 解决方案 > 删除时从子模型中删除文件对象

问题描述

我的模型File的主要目的file是为一个链接多个 s Invoice

class File(models.Model):
    invoice = models.ForeignKey(Invoice, related_name = 'files', on_delete = models.CASCADE)
    file = models.FileField(upload_to = 'storage/invoicing/')
    
    def delete(self, *args, **kwargs):
        self.file.delete()
        return super(File, self).delete(*args, **kwargs)

当我删除我的模型的一个实例时,由于我修改了方法Filefile存储的storage/invoicing也被删除了。delete()

但是,如果我从父模型中删除实例Invoicefile则不会删除。即使File从数据库中删除了实例,file仍然可以访问。

我如何编码父模型以从子模型中删除所有内容,包括文件?

我搜索了一下,我知道类似的信号可能post_delete在这里可以帮助我,但我真的不知道如何编码。

标签: pythondjango

解决方案


pre_delete信号可以帮助您解决问题。

your_app/signals.py

from django.db.models.signals import pre_delete

from your_app.models import Invoice


def remove_files(instance, **kwargs):
    for file_obj in instance.files.all():
        file_obj.file.delete()


pre_delete.connect(remove_files, sender=Invoice)

重要的!

正如您可能已经猜到的那样,pre_delete信号在删除对象(在本例中为Invoice类实例)之前调用指定的函数。这意味着在删除发票和所有相关文件对象之前(由于 CASCADE),它将删除与引用发票的文件对象关联的所有文件。如果由于某种原因删除不会发生,您无论如何都会丢失文件


推荐阅读