栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django删除FileField

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django删除FileField

在Django 1.3之前,当你删除相应的模型实例时,文件会自动从文件系统中删除。你可能正在使用较新的Django版本,因此你必须自己实现从文件系统中删除文件。

你可以通过几种方式做到这一点,其中一种方式是使用

pre_delete
post_delete
信号。


我目前选择的方法是

post_delete
pre_save
信号的混合,这样可以确保在删除相应的模型或更改其文件时删除过时的文件。

基于一个假设

MediaFile
模型:

import osimport uuidfrom django.db import modelsfrom django.dispatch import receiverfrom django.utils.translation import ugettext_lazy as _class MediaFile(models.Model):    file = models.FileField(_("file"),        upload_to=lambda instance, filename: str(uuid.uuid4()))# These two auto-delete files from filesystem when they are unneeded:@receiver(models.signals.post_delete, sender=MediaFile)def auto_delete_file_on_delete(sender, instance, **kwargs):    """    Deletes file from filesystem    when corresponding `MediaFile` object is deleted.    """    if instance.file:        if os.path.isfile(instance.file.path): os.remove(instance.file.path)@receiver(models.signals.pre_save, sender=MediaFile)def auto_delete_file_on_change(sender, instance, **kwargs):    """    Deletes old file from filesystem    when corresponding `MediaFile` object is updated    with new file.    """    if not instance.pk:        return False    try:        old_file = MediaFile.objects.get(pk=instance.pk).file    except MediaFile.DoesNotExist:        return False    new_file = instance.file    if not old_file == new_file:        if os.path.isfile(old_file.path): os.remove(old_file.path)
  • 极端情况:如果你的应用程序上传了一个新文件并在未调用的情况下将模型实例指向该新文件
    save()
    (例如,通过批量更新QuerySet),则旧文件将继续散布,因为不会运行信号。如果使用常规文件处理方法,则不会发生这种情况。
  • 我认为我构建的其中一个应用程序已在生产中使用此代码,但使用时后果自负。
  • 编码样式:此示例将其file用作字段名称,但这不是一个好的样式,因为它与内置file对象标识符冲突。
    也可以看看

  • FieldFile.delete()
    在Django 1.11模型字段参考中(请注意,它描述了
    FieldFile
    该类,但你将
    .delete()
    直接在该字段上调用:
    FileField
    实例代理对应的FieldFile实例,并且可以像访问字段的方法一样访问其方法)

请注意,删除模型时,不会删除相关文件。如果需要清理孤立的文件,则需要自己处理(例如,使用可手动运行或计划通过cron定期运行的自定义管理命令)。

  • 为什么Django无法自动删除文件:Django 1.3发行说明中的​​条目

在早期的Django版本中,当FileField删除包含的模型实例时,FileField它会自己从后端存储中删除文件。这为多种数据丢失情况打开了大门,包括回滚的事务和引用同一文件的不同模型上的字段。在Django 1.3中,删除模型后,不会调用FileField的delete()方法。如果需要清除孤立的文件,则需要自己处理(例如,使用可手动运行或计划通过cron定期运行的自定义管理命令)。

  • pre_delete仅使用信号的示例


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407802.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号