1. ホーム
  2. python

[解決済み] Django - ファイルを作成し、それをモデルの FileField に保存する方法は?

2022-05-29 20:16:36

質問

ここに私のモデルがあります。 モデルインスタンスが保存されるたびに、新しいファイルを生成し、既存のファイルを上書きしたいのです。

class Kitten(models.Model):
    claw_size = ...
    license_file = models.FileField(blank=True, upload_to='license')

    def save(self, *args, **kwargs):
        #Generate a new license file overwriting any previous version
        #and update file path
        self.license_file = ???
        super(Request,self).save(*args, **kwargs)

ファイルをアップロードする方法について、たくさんのドキュメントを見ます。 しかし、ファイルを生成し、それをモデルフィールドに割り当て、Django がそれを適切な場所に保存するにはどうしたらよいでしょうか?

どのように解決するのですか?

あなたが見てみたいのは FileFieldとFieldFile を、そして特に フィールドファイル.save() .

基本的に、フィールドとして宣言されたものは FileField として宣言されたフィールドは、アクセスされると、クラス FieldFile のインスタンスを生成します。このインスタンスは、基礎となるファイルと対話するためのいくつかのメソッドを提供します。つまり、あなたがすべきことは

self.license_file.save(new_name, new_contents)

ここで new_name は割り当てたいファイル名で new_contents がそのファイルの内容です。なお new_contents のインスタンスでなければなりません。 django.core.files.File または django.core.files.base.ContentFile (を使うことができます(詳しくはマニュアルのリンクを参照してください)。

2つの選択肢は、以下のように集約されます。

from django.core.files.base import ContentFile, File

# Using File
with open('/path/to/file') as f:
    self.license_file.save(new_name, File(f))

# Using ContentFile
self.license_file.save(new_name, ContentFile('A string with the file content'))