2009-08-17 5 views
2

Ich arbeite an einer Django App, wo der Benutzer Dokumente verschiedener Art hochladen kann. Der relevante Teil meiner models.py ist dies:django ForeignKey in einen verwendbaren Verzeichnisnamen konvertieren

class Materials(models.Model): 
    id = models.AutoField(primary_key=True) 
    id_presentations = models.ForeignKey(Presentations, db_column='id_Presentations', related_name = "materials_id_presentations") # Field name made lowercase. 
    materialpathname = 'documents/' 
    materialpathname += str(id_presentations) 
    document = models.FileField(db_column='Document', upload_to = materialpathname) # Field name made lowercase. 
    docname = models.CharField(max_length=40, db_column='DocName') # Field name made lowercase. 
    class Meta: 
     db_table = u'Materials' 

Meine Absicht ist es, die Dokumente mit einer bestimmten Präsentation zugeordnet zu speichern, in einem Unterverzeichnis mit der ID-Nummer für diese Präsentation (also wenn „Very Important Präsentation "ist in der Datenbank mit der ID 3, sollte es die zugehörigen Materialien an den Standorteinstellungen.MEDIA_ROOT/documents/3/wasauch immer docname.txt).

Während der obige Code "funktioniert", erstellt es jedoch ein Unterverzeichnis, das anstelle von "3" heißt <django.db.models.fields.related.ForeignKey object at 0x8e358ec> oder so etwas. Ich habe versucht, "id_presentations.name", "id_presentations.value" usw. zu verwenden, aber diese Attribute scheinen nicht zu existieren. Ich kann anscheinend keinen Ort finden, an dem es möglich ist, den ganzzahligen Wert des ForeignKey-Feldes zu erhalten, so dass ich es in einen String umwandeln und als Unterverzeichnisnamen verwenden kann.

Jede Hilfe wird sehr geschätzt.

Antwort

2

Ab Django 1.0 kann das upload_to-Argument für FileFields aufrufbar sein. Wenn ich es richtig, Ihre Absichten bin zu verstehen, so etwas wie dies sollte es tun:

def material_path(instance, filename): 
    return 'documents/%d' % instance.id_presentations.id 

class Materials(models.Model): 
    id_presentations = models.ForeignKey(Presentations) 
    document = models.FileField(upload_to=material_path) 
    docname = models.CharField(max_length=40) 

Das Modell ein wenig vereinfacht, aber hoffentlich zeigt es die Lösung. Wenn upload_to aufrufbar ist, ruft Django bei jedem Hochladen einer Datei die Funktion auf und übergibt ihr zwei Argumente: die Instanz, in die die Datei hochgeladen wurde, und ihr ursprünglicher Dateiname. Sie können den gewünschten Dateipfad generieren, indem Sie die ID der Präsentation von der betreffenden Instanz abziehen.

Weitere Informationen: http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield

+0

Dank, sowohl für Ihr Beispiel und den Link (weiß nicht, wie ich es verpasst). Hier ist, was Arbeits endete: def material_path (zB Dateinamen): return 'documents /% d /% s' % (instance.id_presentations.id, Dateiname) (gleiche wie Sie außer Dateinamen von material_path zu beenden fügt) Das speichert schließlich zu [MEDIA_ROOT] /documents/4/somefile.txt, wenn das Dokument somefile.txt mit der Präsentation verknüpft ist, die ID = 4 hat. – rossdavidh

0

Vorausgesetzt, dass die Eigenschaft "name" in Ihrem Präsentationsmodell definiert ist, sollten Sie, wenn Sie mit einer bestimmten Instanz des Modells arbeiten, das gewünschte Ergebnis erzielen. Wie folgt aus:

from models import Materials 
obj = Materials.objects.get([some criteria here]) 
name = obj.id_presentation.name 

Wenn Sie abstrahieren wollte, dass ein Verfahren nach Modell, könnten Sie dies tun:

class Materials(models.Model): 
    def id_presentation_name(self): 
     return self.id_presentation.name 

Wenn Sie die Datenbank-ID des Objekts möchten, können Sie entweder Objekt zugreifen .id oder object.pk.

0

Hinweis: Sie können immer herausfinden, welche Attribute und Methoden für ein Objekt in Python verfügbar sind, indem Sie dir (object) aufrufen.

Verwandte Themen