【问题标题】:Renaming django FileField files重命名 django FileField 文件
【发布时间】:2012-02-03 17:35:17
【问题描述】:

在 django 应用程序中添加了一些附加功能,因此也扩展了 upload_to 功能。

由于 django 默认将文件名存储在数据库中,并将文件存储在磁盘上,因此没有造成任何损害 - 新文件使用新的 upload_to 函数命名,而旧文件继续工作。

但是,这很混乱 - 我们最终会遇到类似

之类的文件的情况
/media/userID/oldfilename.pdf 

/media/app/userID/projectID/newfilename.pdf 

有没有办法批量重命名这些文件?我想这可以通过遍历数据库来完成,检查 FileField 中的路径是否与当前 upload_to 的结果匹配,如果不匹配,则重命名.. 这似乎是一个常见问题,所以也许有更通用的方法?

【问题讨论】:

  • 我不知道有任何不涉及自己编写脚本的方法。

标签: django filefield


【解决方案1】:

简单的解决方案是编写自定义Django management command。您可以使用 Django 的标准 manage.py 运行命令。

类似这样的:

from django.core.management.base import BaseCommand, CommandError
from example.models import YourModel

class Command(BaseCommand):
    args = ''
    help = ''

    def handle(self, *args, **options):

        # Get all objects
        objects = YourModel.objects.all()

        for object in objects: # For each object

            # If old file path:
            if not 'userID/projectID' in objects.filefield.name:
                # Move the file, eg usign shutil http://docs.python.org/library/shutil.html#shutil.move
                # Update filefield
                # save object

【讨论】:

  • 是的,这就是我所说的“通过数据库的哑循环”——我想知道是否有合理的方法来做到这一点——我可能会将它包含在 .save() 方法中模型,以便首先为经常访问的模型在线完成
  • 'dumb loop' 似乎是一个干净的解决方案,可以一劳永逸地解决问题。覆盖保存只会减少“混乱”。
  • 只是好奇。如果这只是打算运行一次,那么作为数据迁移实现不是更好,但是如果您预见自己将来更改文件路径/命名方案,请按照上述 mgmt cmd 进行操作?跨度>
  • @ckot 迁移是在 2014 年添加的,答案是从 2013 年开始的 :)
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2014-08-09
  • 2014-12-30
  • 2019-02-27
  • 1970-01-01
  • 2013-06-25
  • 2011-02-02
相关资源
最近更新 更多