在Django默认环境之外替换/更改数据库中的文件路径

时间:2018-05-26 08:02:13

标签: django django-models

1)我有一个包含文件名的模型:

 class Image(models.Model):
    p = models.ForeignKey(P, related_name='images', on_delete=models.CASCADE)
    image = models.ImageField(upload_to=file_upload_to)

因为我正在移动文件夹结构,我想更改Django之外的数据库中的图像列记录。

所以,我试过了:

images = Image.objects.all()
for image_obj in images:
    image_obj.image.url.replace('co', 'assoc')
    image.obj.save()

失败,什么都不做;

如果我尝试使用image_obj.image,我会收到以下错误:

  

' ImageFieldFile'对象没有属性'替换'

2)我对JsonField有类似的问题:

for key, value in types.items():
        v = value.replace('a', 'c2')
        types[key] = v

在这种情况下,而不是替换是保存一个空的json。

1 个答案:

答案 0 :(得分:1)

实际上django ImageField是在数据库中存档的,所以你可以用下一步替换:

images = Image.objects.all()
for image_obj in images:
    image_obj.image = image_obj.image.url.replace('co', 'assoc')
    image.obj.save()

或者bulk update使用sql替换功能

from django.db.models import F, Func, Value

Image.objects.update(
    image=Func(
        F('image'),
        Value('co'), Value('assoc'),
        function='replace',
    )
)