首页 > 解决方案 > 在 Django 默认环境之外的数据库中替换/更改文件路径

问题描述

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' 对象没有属性 'replace'

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

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

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

标签: djangodjango-models

解决方案


实际上 djangoImageField是在数据库中归档的字符,因此您可以通过以下方式进行替换:

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

或者做批量更新使用 sql 替换功能

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

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

推荐阅读