1

重複の可能性:
実行時に決定される upload_to を持つ Django FileField

Dropbox のように、ユーザーがオンラインでファイルを保存できる Web アプリケーションを作成しています。ユーザーのファイルは、モデル Item によってモデル化されます。

from django.db import models
from django.contrib.auth.models import User


class Item(models.Model):
    # Name of file
    name = models.CharField(max_length=200)

    # Site user who owns the file
    user = models.ForeignKey(User)

    # Path to file in database
    # Python complains here since "username" is an attribute of the User class, not
    # an attribute of ForeignKey.
    file = models.FileField(upload_to=(user.username + '/' + name))

FileField の upload_to 引数を見ると、データベース内のファイルの保存場所を指定したいと思います。ファイル「myfile」を持つユーザー「bill」がいる場合、彼のファイルはパス「bill/myfile」の下にある必要があります。

この文字列を取得するために、「user.username + '/' + name」を試しましたが、python は、user は User オブジェクトではないため、user には属性 username がないと文句を言います。これは、User を格納する ForeignKey です。問題は、コード内で ForeignKey からユーザー オブジェクトを取得するにはどうすればよいかということです。

APIを使用する前にオブジェクトをデータベースに保存する必要があるため、DjangoのデータベースAPIは機能しません。Item オブジェクトの構築中にデータが必要なため、これは当てはまりません。

4

2 に答える 2

1

FileFieldを使用すると、[upload_toに関数][1]を配置できます。

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to

于 2012-08-21T00:56:31.700 に答える
1

あなたが渡すものは何でも一度upload_to呼び出されるため、あなたのアプローチにはいずれにしても欠陥があります。機能したとしても、クラスが定義されたときにのみ計算されることを覚えておく必要があります。user.username

フィールドに渡すカスタムupload_to関数を定義する必要があります。

def custom_upload_to(instance, filename):
     return '{instance.user.username}/'.format(instance=instance)

myfield = models.FileField(upload_to=custom_upload_to)
于 2012-08-21T04:09:41.933 に答える