python使用delete_Python Django 调用post_delete() 做自定义删除

本文介绍了如何在Django中利用post_delete信号处理来自定义模型的删除操作,特别是在未使用FileField保存文件的情况下,如何在删除对象时一并删除关联的文件。示例代码展示了创建虚拟环境、安装Django、创建模型以及设置信号接收器来实现文件的删除。
摘要由CSDN通过智能技术生成

最近做一个项目, 因为上传的文件没有采用django自带的FileField来保存, 导致删除对象时, 需要在views中添加代码来删除其关联的文件. 研究了一下, 发现django中可以通过post_delete来自定义删除行为. 示例代码如下:

$ mkdir mysite

$ cd mysite/

$ virtualenv --python=python3.6 venv

$ source venv/bin/activate

$ pip install django

$ python -m django startproject mysite .

$ python manage.py startapp blog

$ vim blog/models.py

$ cat blog/models.py

from django.conf import settings

from django.db import models

from django.db.models.signals import post_delete

from django.dispatch import receiver

from django.contrib.auth.models import User

class Article(models.Model):

title = models.CharField(max_length=80)

text = models.TextField()

author = models.ForeignKey(User, on_delete=models.CASCADE)

attach = models.CharField(max_length=255) # 文件上传后保存在服务器上的路径

@receiver(post_delete, sender=Article)

def delete_upload_files(sender, instance, **kwargs):

files = getattr(instance, 'attach', '')

if not files:

return

fname = os.path.join(settings.MEDIA_ROOT, files)

if os.path.isfile(fname):

os.remove(fname)

$ echo "MEDIA_URL = '/media/'" >> mysite/settings.py

$ echo "MEDIA_ROOT = os.path.join(BASE_DIR, 'media')" >> mysite/settings.py

大致就这些了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值