django应用程序中添加了一些附加功能,因此upload_to函数也得到了扩展。
由于django默认情况下将文件名存储在数据库中,并将文件存储在磁盘上,因此没有造成任何危害——新文件使用新的upload_to函数命名,而旧文件继续工作。
然而,这是混乱的-我们最终会遇到像这样的文件
/media/userID/oldfilename.pdf
和
/media/app/userID/projectID/newfilename.pdf
有办法批量重命名这些文件吗?我想这可以通过遍历数据库来完成,检查FileField中的路径是否与当前upload_to的结果匹配,如果不匹配,请重命名。。这似乎是一个常见的问题,所以也许还有一种更通用的方法?
简单的解决方案是编写一个自定义的Django管理命令。您可以使用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