2011-08-09 12 views
0

写真はプロジェクトに属するシステムを作りたいと思います。私はまた、プロジェクトのzipファイルを直接アップロードすることができ、指定されたプロジェクトに写真を解凍して登録することができました。しかし、私は、Photoクラスを定義する際に問題を抱えています。Django、モデル内でのForeignKeyの値の使用

Project.file_zip.pathの値を、imgフィールドのupload_to属性を定義する現在のインスタンスで取得する必要があります。しかし、私が以下のようにしようとすると、AttributeError: 'ForeignKey' object has no attribute 'file_path'と返されます。どうすれば修正できますか?

class Project(models.Model): 
.... 
owner=models.ForeignKey(User) 
file_zip=models.FileField(upload_to='projects/%Y/%m/%d') 

def __unicode__(self): 
    return self.project_name 

def file_path(self): 
    return re.search(re.search('[^\s]+(?=\.zip)', self.file_zip).group(0)) 

class Photo(models.Model): 
    belongs_to=models.ForeignKey(Project) 
    img=models.ImageField(upload_to='/home/contact/python_project/all_bugs_will_reveal/'+belongs_to.file_path()) 
    desc=models.CharField(max_length=255) 

答えて

3

定義が読み込まれている時点で、クラスがまだ定義されていないとしてあなたは、同じモデルの定義内にモデル内のフィールドを参照することはできません。

ソリューションはupload_toのための呼び出し可能を使用することです - in the documentationを示すように、あなたは正しいパスを取得するためにinstance.filepath()を呼び出すことができますので、これは、パラメータinstancefilename与えられた関数とすることができます。

+0

私はあなたの指示に従います。私は関数を無効に定義したか、正しい方法で呼び出すことはできません。 '%s /%s '%(instance.belongs_to.file_path、filename)'と 'img = models.ImageField(upload_to = project_path())は' TypeError:project_pathで返されます。 ()は正確に2つの引数(0が与えられます) ' –

+0

は' ImageField(upload_to = project_path) 'でなければなりません。それ以外の場合は、ファイルがアップロードされたときではなく、パラメータが指定されていないときに関数が呼び出されます。 –

+0

はい、実際には正しいコードを書いていましたが、別の場所で間違いを犯しましたが、バグを見つけようとしているうちに、私もそれを変更しました。今でもうまくいきます。ありがとう。 –

関連する問題