11

ここに非常によく似たスレッドがあることは知っていますが、問題の解決策を見つけることができません。

djangomodels.FileFieldに保存されているファイルの名前を変更する必要があります

私はこれを試しました

os.rename(old_path, new_path)
mod.direct_file = File(open(new_path))
mod.save()

この

mod.direct_file.save(new_path, File(open(old_path)))
os.remove(old_path)

そして他の多くの方法が、何も役に立たなかったようです。新しいファイルはあらゆる方法で作成されますが、ファイルフィールドのデータはまったく変更されません。

編集:解決済み

os.rename(old_path, new_path)
cursor = connection.cursor()
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id])
transaction.commit_unless_managed()
4

6 に答える 6

2
 new_name = 'photos_preview/' + str(uuid.uuid1())
 os.rename(photo.image_preview.path, settings.MEDIA_ROOT + new_name)
 photo.image_preview.name = new_name
 photo.save()
于 2015-01-27T15:19:20.013 に答える
2

現在の Django ドキュメントには次のように記載されています。

「モデルの FileField にアクセスすると、基になるファイルにアクセスするためのプロキシとして FieldFile のインスタンスが与えられます。」詳細については、ドキュメントを参照してください。

Python File オブジェクトを使用してファイルを開く代わりに、 FieldFile.open() を使用してファイルを開き、それに応じてファイルのパスを操作する必要があります。その後、モデル オブジェクトを保存すると、パスへの変更が保持されます。

于 2012-09-10T20:41:32.540 に答える
1

ファイル拡張子なしで blob を django に保存したときにこの問題に遭遇し、それを修正したかったのです。フィルタリングされたクエリセットをループするときに最適です。

instance.picture.path を変更することはできません。また、instance.picture.file.* にアクセスしようとすると、古いファイルを開こうとするため、エラーが発生します。instance.picture.name を設定しても、保存後でも instance.picture.file.* にアクセスできません。

ImageField オブジェクト自体をその場所に設定するだけで、すべてが機能します。

(django 1.10でテスト済み)

import imghdr
import os

from django.db import models

class MyModel(models.Model):
    picture = models.ImageField()

instance = MyModel.objects.first()
if os.path.exists(instance.picture.path):
    extension = imghdr.what(instance.picture.path)
    os.rename(instance.picture.path, instance.picture.path + '.' + extension)
    instance.picture = instance.picture.name + '.' + extension
    instance.save()
于 2017-02-15T10:17:22.117 に答える