2011-01-12 1 views
0

最初の投稿はこちら。Djangoでは多くのファイルを特定のモデルに関連付けたいので、ファイルと呼ばれる別々のモデルを実行し、モデル 'A'多くのファイルがあります。しかし、私は私のファイルがモデル 'A'によって指名されたディレクターに保存されることを望みます。djangoモデルの他のオブジェクトを参照するにはどうすればいいですか?

class Show(models.Model): 
    name = models.CharField() 
    showfolder = models.FilePathField() 

class Episode(models.Model): 
    show = models.ForeignKey(Show) 
    name = models.CharField() 
    files = models.ManyToManyField(mp3) 

class Mp3(models.Model): 
    file = FileField(upload_to=Episode.show.showfolder) 

だから、うまくいけば、その最後の行は、私はそれが(エピソードに関連付けられている表示オブジェクトからフォルダ名を取得する)何をしたいか表現:だから、例えば私はこのような何かをしたいです。質問はどうすればそれを本当に書くのですか?(コントローラーのフープを飛び越える以外に)

ありがとう。

答えて

1

あなたの現在のモデルでは、Mp3のエピソードManyToMany関係のため、1つのファイルを1つ以上のエピソードに関連付けることは可能です。つまり、ファイルが複数の場所に同時に存在する必要があります。ファイル名については今

class Mp3(Model): 
    episode = ForeignKey(Episode) 

:あなたはエムモデルにエピソードにはForeignKeyを必要とする階層構造を持っている

django documentationによれば、upload_to属性は呼び出し可能であり、2つの引数、instancefilenameを渡すことができます。

def get_file_name(instance, original_filename): 
    return os.path.join(MEDIA_ROOT, 'mp3', instance.episode.show.showfolder,  
         original_filename) 

class Mp3(Model): 
    file = FileField(upload_to=get_file_name) 
+0

ありがとうSkirmantas!あなたの答えを読んだ後、私はあなたのリンクをクリックして、それは直前に私が知る必要があった文章をすべて読んでいて、何とかそれをスキップしたことが判明しました!(私はたいていスキムをしません)。複数の場所にあるファイルについては、エピソードではなくShowオブジェクトに基づいているため、私は心配する必要はないと考えています。エピソードは1つのショーにしか属していません。または私は何かを逃している? – UserZer0

+0

'songA-> episodeX'と' songA-> episodeY'と言うことができます。今では意図されていないが、 'EpisodeX-> Show1'、' EpisodeY-> Swow2'が可能です。あなたの管理インターフェースには、すべての曲がすべてのエピソードで利用できるボックスがあります。だから間違いはかなり起こりうる。あなたの 'Mp3'の代わりに、あなたは' Show'に直接 'ForeignKey'を持つことができます。 Mp3にはMp3に限られた選択肢があり、Showは現在のエピソードの親です。限定された選択フィールドのドキュメントをチェックしてください:http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.limit_choices_to – Ski

+0

私は 'limit_choices'部分について間違っているかもしれません。これらの選択肢をこの属性で正しく制限する方法はないようです。しかし、いずれにせよ私はあなたに表示するForeignKeyを持ってお勧めします。オブジェクトを照会する方が簡単になります。 – Ski

関連する問題