python - 删除时从子模型中删除文件对象
问题描述
我的模型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)
当我删除我的模型的一个实例时,由于我修改了方法File
,file
存储的storage/invoicing
也被删除了。delete()
但是,如果我从父模型中删除实例Invoice
,file
则不会删除。即使File
从数据库中删除了实例,file
仍然可以访问。
我如何编码父模型以从子模型中删除所有内容,包括文件?
我搜索了一下,我知道类似的信号可能post_delete
在这里可以帮助我,但我真的不知道如何编码。
解决方案
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),它将删除与引用发票的文件对象关联的所有文件。如果由于某种原因删除不会发生,您无论如何都会丢失文件。
推荐阅读
- html - 试图在一个 div 中居中一个 div
- qml - 将 MouseArea 事件从父级传播到子级
- node.js - 从 node/express 对文件调用 OS 命令
- amazon-web-services - Amazon Elastic Beanstalk ebextension 将 nginx 配置参数添加到默认配置中
- vue.js - 选择下一个/上一个项目并将其放在织物 js 的前面
- terraform - 使用 terraform.workspace 选项时,Terraform 插值抛出错误
- spring - 如何保护 Spring Security 中受 IP 地址限制的匿名访问?
- c# - Amazon S3 存储桶 C# API 未捕获错误
- c# - Npgsql 4.0 参数和空值
- sql - 最早可用日期 - 总数量