我更改了模型图片字段的upload_to
属性。如何将所有图像重新上传到新路径?
答案 0 :(得分:1)
所以,我认为重新上传'这是错误的思考方式 - 重新上传图像仍然会让旧图像四处闲置,这取决于你有多少图像,这可能是一个巨大的空间浪费。实现此目的的一种方法是通过以下两个步骤:
1)通过适当的操作系统方法,在您的服务器上手动将文件移动到新的upload_to
位置。这可能都是在linux上使用一个mv
命令完成的,如果这是你正在托管的内容。
2)如果你只是更改了upload_to属性,并且没有更改MEDIA_ROOT设置或其他任何内容,那么您需要更改的是Imagefield的{{1}属性。正确的ImageField名称通常是您的name
字符串和图像文件名的连接(然后将其附加到MEDIA_URL以形成图像url或MEDIA_ROOT以形成实际的上传路径)。因此,您可以通过键入以下内容来更新Django shell中的模型:
upload_to
您可以通过调用import os
from my_app import MyModel
newpath = 'your/new/upload_to/'
for obj in MyModel.objects.all():
image_name = os.path.split(obj.my_img_field.name)[1]
obj.my_img_field.name = newpath + image_name
obj.save()
检查一切是否正常工作,并查看它是否应该指向该位置。
答案 1 :(得分:0)
当我需要在许多型号上执行此操作,而又不想在操作系统级别上执行此操作时,这是我的一些摘要。
为了与strftime一起使用,必须对此进行修改。
models = (YourModel1, YourModel2)
for Model in models:
for field in Model._meta.get_fields():
if not hasattr(field, 'upload_to'):
continue
for instance in Model.objects.all():
f = getattr(instance, field.name)
if not f:
continue
if field.upload_to not in str(f):
filename = os.path.basename(f.name)
new_path = os.path.join(field.upload_to, filename)
os.makedirs(
os.path.join(
settings.MEDIA_ROOT,
field.upload_to
),
exist_ok=True
)
try:
shutil.move(
os.path.join(settings.MEDIA_ROOT, f.name),
os.path.join(settings.MEDIA_ROOT, new_path)
)
setattr(instance, field.name, new_path)
except FileNotFoundError as e:
logger.error("Not found {}".format(field.name))
logger.error(str(e))
else:
instance.save()