2011-01-12 10 views
0

ersten Beitrag hier.In Django möchte ich viele Dateien mit einem bestimmten Modell zugeordnet werden, so mache ich ein separates Modell namens Dateien und haben Modell 'A' ' habe viele 'Dateien. Aber ich möchte, dass meine Dateien in einem Regisseur gespeichert werden, der nach Modell A benannt ist. So Zum Beispiel habe ich so etwas wie dies will:Wie referenziere ich das andere Objekt in Django-Modelle

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) 

so hoffentlich die letzte Zeile zum Ausdruck bringt, was ich will es (erhält die Ordnernamen von Show-Objekt mit der Folge verbunden ist) zu tun. Die Frage ist, wie würde ich das wirklich schreiben? (Neben dem Springen durch die Reifen im Controller.)

Danke.

Antwort

1

In Ihrem aktuellen Modell wegen Episode ManyToMany Beziehung zu MP3 ist es möglich, dass eine Datei mit einer oder mehreren Episoden verbunden ist. Das würde bedeuten, dass Ihre Datei gleichzeitig an mehreren Orten existieren muss.

eine hierarchische Struktur haben Sie ForeignKey zu Folge in MP3-Modell benötigen:

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

jetzt über Ihre Dateinamen. Nach django documentation, upload_to Attribut kann Callable akzeptieren und wird zwei Argumente übergeben: instance und filename.

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

Danke Skirmantas! Nachdem ich Ihre Antwort gelesen hatte, klickte ich auf Ihren Link und es stellte sich heraus, dass ich vor dem Posting alles bis zu dem Satz gelesen hatte, den ich wissen musste, und es irgendwie übersprungen habe! (Ich überspringe normalerweise auch nie). Da sich eine Datei an mehr als einem Ort befindet, muss ich mir darüber keine Gedanken machen, da der Pfad auf dem Show-Objekt basiert, nicht auf der Episode, sondern nur auf einer Show. oder verpasse ich etwas? – UserZer0

+0

Sagen wir 'songA-> episodeX' und' songA-> episodeY'. Jetzt ist es nicht gedacht, aber möglich für: 'EpisodeX-> Show1',' EpisodeY-> Swow2'. In Ihrer Admin-Oberfläche haben Sie eine Box, in der alle Songs für jede Episode verfügbar sind. Ein Fehler ist also wahrscheinlich. Stattdessen könnten Sie in 'Mp3' einen' ForeignKey' direkt zu 'Show' haben. Und in 'Episode'.ManyToMany'->' Mp3' mit eingeschränkten Auswahlmöglichkeiten zu jenen Mp3 welche Show Eltern der aktuellen Episode ist. Überprüfen Sie die Dokumentation für begrenzte Auswahlfelder: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.limit_choices_to – Ski

+0

Ich könnte falsch mit dem 'limit_choices' Teil sein. Es scheint keine Möglichkeit zu geben, diese Auswahl mit diesem Attribut korrekt zu beschränken. Aber auf jeden Fall empfehle ich Ihnen, einen ForeignKey zu zeigen. Es wird einfacher sein, nach Objekten zu suchen. – Ski

Verwandte Themen