============== ファイルの管理 ============== :revision-up-to: 17812 (1.4) このドキュメントでは、 Django のファイルアクセス API について解説します。 デフォルトの構成では、 Django は :setting:`MEDIA_ROOT` と :setting:`MEDIA_URL` に基づいてファイルをローカルのファイルシステムに保存し ます。このドキュメントの以降の例では、デフォルトの構成での動作を想定してい ます。 ただし、 Django には :ref:`ファイルストレージシステム ` をカスタマイズして、ファイルの保存方法を完全にカスタマイズする方法がありま す。このドキュメントの後半部分では、ストレージシステムの仕組みを説明します。 モデル内でファイルを扱う ========================== モデル内で :class:`~django.db.models.FileField` や :class:`~django.db.models.ImageField` を使うと、 Django はフィールドに対し てファイルを操作するための API を提供します。 以下のような、写真の保存に :class:`~django.db.models.ImageField` を使っている モデルを考えましょう:: class Car(models.Model): name = models.CharField(max_length=255) price = models.DecimalField(max_digits=5, decimal_places=2) photo = models.ImageField(upload_to='cars') ``Car`` インスタンスには ``photo`` という属性ができ、この属性を使ってモデル に結びつけられたファイルの詳細を取得できます:: >>> car = Car.object.get(name="57 Chevy") >>> car.photo >>> car.photo.name u'cars/chevy.jpg' >>> car.photo.path u'/media/cars/chevy.jpg' >>> car.photo.url u'http://media.example.com/cars/chevy.jpg' このオブジェクト (例中の ``car.photo``) が ``File`` オブジェクトで、後で述 べるメソッドや属性を備えています。 .. note:: モデルがデータベースに保存される一環としてファイルは保存されます。 なので、モデルの保存が終わるまで実際のファイル名は信用できません。 ``File`` オブジェクト ===================== 内部的には、 Django はファイルを表現する必要がある場合には常に :class:`django.core.files.File` を使います。このオブジェクトは Python の `組み込みファイルオブジェクト `_ に対する薄いラッパで、 Django 固有の機能が追加されています。 .. _built-in file object: http://docs.python.org/library/stdtypes.html#bltin-file-objects 普段は、単に (モデルに結びつけられたファイルや、アップロードされたファイル として) Django から渡される ``File`` オブジェクトを使うだけでしょう。 ``File`` オブジェクトを自分で生成したければ、 Python 組み込みの ``file`` オブジェクトを使うのが最も簡単です:: >>> from django.core.files import File # Create a Python file object using open() >>> f = open('/tmp/hello.world', 'w') >>> myfile = File(f) これで、 :class:`django.core.files.File` クラスの属性やメソッドの全てを 使えます。 .. _file-storage: ファイルストレージ =================== 舞台裏では、 Django はファイルの保存方法に関する決定をファイルストレージシ ステムに委ねています。ファイルストレージシステムは、ファイルシステムの構造 や、ファイルの開き方、データの読み出し方などを知っているオブジェクトです。 Django のデフォルトのファイルストレージは :setting:`DEFAULT_FILE_STORAGE` に設定します。明示的にストレージシステムを指定しなければ、デフォルトのファ イルストレージとしてこの設定の値を使います。 組み込みのファイルストレージシステムの詳細は下記を参照してください。また、 ファイルストレージシステムを自作する方法は :doc:`/howto/custom-file-storage` を参照してください。 ストレージオブジェクト ----------------------- ほとんどの場合は ``File`` オブジェクトを使い (``File`` オブジェクトに実際 のストレージの操作を肩代りさせ) ますが、ストレージシステムの直接操作もでき ます。カスタムのファイルストレージクラスのインスタンスを生成したり、グロー バルなデフォルトのストレージシステムに設定したりできるのです:: >>> from django.core.files.storage import default_storage >>> from django.core.files.base import ContentFile >>> path = default_storage.save('/path/to/file', ContentFile('new content')) >>> path u'/path/to/file' >>> default_storage.filesize(path) 11 >>> default_storage.open(path).read() 'new content' >>> default_storage.delete(path) >>> default_storage.exists(path) False ファイルストレージの API については :doc:`/ref/files/storage` を参照してくだ さい。 組み込みのファイルシステムストレージクラス ------------------------------------------- Django には組み込みの ``FileSystemStorage`` クラスが付属しています (このク ラスは ``django.core.files.storage`` で定義されています)。 ``FileSystemStorage`` は基本的な機能を持ったローカルファイルシステムストレー ジの実装です。初期かメソッドは以下の二つの引数をとります: ====================== =================================================== 引数 説明 ====================== =================================================== ``location`` 省略可能です。ファイルを保存するディレクトリの絶対 パスです。省略すると、 :setting:`MEDIA_ROOT` の 設定値を使います。 ``base_url`` 省略可能です。保存されているファイルを公開する URL です。省略すると、 :setting:`MEDIA_URL` の設定値を 使います。 ====================== =================================================== 例えば、以下のコードは、アップロードされたファイルを :setting:`MEDIA_ROOT` の設定 値と関係なく、 ``/media/photos`` 以下に保存します:: from django.db import models from django.core.files.storage import FileSystemStorage fs = FileSystemStorage(location='/media/photos') class Car(models.Model): ... photo = models.ImageField(storage=fs) :doc:`カスタムのストレージシステム ` でも同じで、 :class:`~django.db.models.FileField` の ``storage`` にストレージのインスタンスを 渡します。