您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Django删除FileField

Django删除FileField

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

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

例 我目前选择的方法post_deletepre_save信号的混合,这样可以确保在删除相应的模型或更改其文件删除过时的文件

基于一个假设MediaFile模型:

import os
import uuid

from django.db import models
from django.dispatch import receiver
from 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)

编码样式:此示例将其file用作字段名称,但这不是一个好的样式,因为它与内置file对象标识符冲突。 也可以看看

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

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

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

Go 2022/1/1 18:24:25 有318人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶