Django でファイルアップロード先を動的に変更する方法

Django1.0発表目前ということで、いろいろと最近のアップデートを確認してたんですが、ひそかに待ちこれがれていた、動的にファイルアップロード先を変更することができるようになっていました。

何がしたかったのかというと、ファイルのアップロード先を1つのディレクトリにしてしまうと、大量になった場合に事件が起こるので、それをユーザ名でディレクトリを分けて、比較的平穏にしようというわけです。

今までは、FileField を継承したカスタムフィールド使ってたんですが、File storage refactoring によって upload_to に callable なものが渡せるようになったので、これを使って動的にディレクトリを分けることができるようになりました。ちなみに、日付ベースでディレクトリを分けるっていうのは前からできてたんですよね。個人的には、ユーザごとに分けたいことが多かったのでそっちはあんまり使ったことないです。

def _get_upload_path(instance, filename):
    # ユーザ名をディレクトリに指定
    path = 'store/%s' % instance.user.username
    # ファイル名も自前でつける
    root, ext = os.path.splitext(filename)
    new_root = datetime.now().strftime('%Y%m%d%H%M%S')
    return os.path.join(path, new_root + ext)


class Photo(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=255)
    description = models.TextField()
    content = models.FileField(upload_to=_get_upload_path)

アップロード先のパスを返す関数(ここでは、_get_upload_path)を定義しておいて、upload_to に指定するだけです。引数に、 instance (この場合、Photo クラスのインスタンス)と filename を受け取る必要があります。ユーザ名で分ける以外にもいろいろできると思います。アップロード先のパスがない場合も多分作ってくれます。(もちろんパーミッションがあれば)。ドキュメントには、絶対パスを返せって書いてあった気がして、そうしてたら DB にフルパスがはいってしまって困ったりしましたが、通常通り、MEDIA_ROOT 以下のパスだけ渡したら解決しました。

File storage refactoring は他にもいろいろと変わってます。

http://code.djangoproject.com/wiki/FileStorageRefactor

ちなみに、こちらにも同じような内容が書かれていました。

http://scottbarnham.com/blog/2008/08/25/dynamic-upload-paths-in-django/

日本だと今日の深夜あたりにリリースされるんですかね。 Django1.0 楽しみです。

ちなみに今回から reStructuredText でエントリーを書くことにしました。こっちの方が楽。(今までは HTML かいてました)

Posted at: 
2008/09/02 18:56:33
0 Comments
1 TrackBack
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/09/02/django_dynamic_upload_path/trackback/

TrackBacks

[Django][Google App Engine]巡回 - 常山日記

Django Project: Security fix released Django 1.0 release candidate now available Django Snippets: render_partial easy admin registration Google Code: django-syncr Synchronize Django with the web Blog: Django でファイルアップロード先を動的に変更する方法 5

Created at: 
2008/09/03 19:12:57

Comments

まだ登録されていません。

Add Comment

Add Comment