【问题标题】:Renaming files in Django FileField在 Django FileField 中重命名文件
【发布时间】:2012-09-10 20:27:15
【问题描述】:

我知道这里有一个非常相似的线程,但我找不到解决问题的方法。

我需要重命名保存在 django models.FileField 中的文件

我试过了

os.rename(old_path, new_path)
mod.direct_file = File(open(new_path))
mod.save()

还有这个

mod.direct_file.save(new_path, File(open(old_path)))
os.remove(old_path)

还有许多其他方法,但似乎没有任何帮助。以各种方式创建了一个新文件,但是 filefield 中的数据根本没有改变。

编辑:已解决

os.rename(old_path, new_path)
cursor = connection.cursor()
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id])
transaction.commit_unless_managed()

【问题讨论】:

    标签: django file django-models filefield


    【解决方案1】:

    我认为您不需要为此使用原始 SQL。我认为您需要使用os 工具重命名文件,然后将模型的FileField 名称设置为新名称。可能是这样的:

    os.rename(model.direct_file.path, new_path)
    model.direct_file.name = new_name
    model.save()
    

    【讨论】:

    • 这仅在使用FileSystemStorage时有效。
    【解决方案2】:

    当前的 Django 文档指出:

    “当您访问模型上的 FileField 时,您将获得一个 FieldFile 的实例作为访问底层文件的代理。”如需进一步阅读,请参阅docs

    您应该使用 FieldFile.open() 打开文件,而不是使用 Python File 对象打开文件,然后相应地操作文件的路径。之后,保存模型对象,对路径的更改应该会持续存在。

    【讨论】:

    • 打开方法打开已经分配的文件。 FieldFile 没有办法打开另一个文件。
    • 文件是通过 FileField 分配的,对吗?您是要更改模型中的所有文件,还是要更改模型的单个实例?
    • 我想重命名此字段中上传的文件direct_file = models.FileField(default=None, blank=True, null=True, upload_to="mod_files")
    • 我仍然不清楚您是要重命名模型字段“direct_file”,还是要重命名存储在文件系统上的实际文件。当尝试重命名存储在文件系统上的文件时,我的回答适用。
    • 我想重命名文件系统中的文件。
    【解决方案3】:
     new_name = 'photos_preview/' + str(uuid.uuid1())
     os.rename(photo.image_preview.path, settings.MEDIA_ROOT + new_name)
     photo.image_preview.name = new_name
     photo.save()
    

    【讨论】:

      【解决方案4】:

      当我将 blob 保存到没有文件扩展名的 django 中时遇到了这个问题,我想纠正这个问题。最好在循环过滤的查询集时使用。

      您无法更改 instance.picture.path,并且尝试访问 instance.picture.file.* 会出错,因为访问它会尝试打开旧文件。设置 instance.picture.name 仍然不会让您访问 instance.picture.file.*,即使在保存之后也是如此。

      您可以简单地将 ImageField 对象本身设置为该位置,一切都会起作用:

      (使用 django 1.10 测试)

      import imghdr
      import os
      
      from django.db import models
      
      class MyModel(models.Model):
          picture = models.ImageField()
      
      instance = MyModel.objects.first()
      if os.path.exists(instance.picture.path):
          extension = imghdr.what(instance.picture.path)
          os.rename(instance.picture.path, instance.picture.path + '.' + extension)
          instance.picture = instance.picture.name + '.' + extension
          instance.save()
      

      【讨论】:

        【解决方案5】:

        您可以使用以下内容:

        假设 'obj' 是您要重命名的 django 对象。然后这样做:

        obj.file_field_name.name = new_name

        obj.save()

        【讨论】:

          【解决方案6】:

          根据 django 文档,在 FileField 中更改二进制文件的文件名似乎非常不灵活。它包含来自媒体根目录的路径。 这指出了一个反映路径的名称 attr,而不仅仅是文件名本身。文档:This is the way that django model can find the file

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-30
            • 2013-06-25
            • 2011-02-10
            • 2011-10-08
            • 1970-01-01
            • 1970-01-01
            • 2014-08-09
            • 2019-02-27
            相关资源
            最近更新 更多