2012-05-16 7 views
13

Gibt es eine Möglichkeit, beim Erstellen eines neuen Modells keine Modellinstanz für einen Fremdschlüssel übergeben zu müssen? Lassen Sie uns sagen, ich habe die folgenden Modelle:Django ForeignKey-Instanz und Raw-ID

class Foo(models.Model): 
    description = models.CharField(max_length=100) 

    class Meta: 
     db_table = u'foo' 

class Bar(models.Model): 
    info = models.CharField(max_length=100) 
    foo = models.ForeignKey('Foo') 

    class Meta: 
     db_table = u'bar' 

Je später eine Anfrage Post kommt in einer Ansicht - ich kenne die die ID eines foo Rekord und will nur einen Datensatz in der Bar-Tabelle einzufügen.

, wenn ich tun:

new_bar = Bar(info="something important", foo=foo_id) 
new_bar.save() 

Ich erhalte einen Valueerror sagen: „Kann nicht zuordnen "546456487466L": " Bar.foo" nur sein "Foo" Instanz

Also, ich verstehe. .. Ich möchte, dass ich eine tatsächliche Instanz des Foo-Modells habe.Ich verstehe, dass ich einfach ein Foo machen kann und es dann weitergeben kann. Aber es scheint, als müsste es einen Weg geben, diese Funktionalität außer Kraft zu setzen etwas Googeln und Lesen der Dokumente, und Raw_id_fields in Admin scheint die Grundidee zu sein. (das heißt, erlauben Sie eine rohe ID hier.) Aber sehen Sie nicht diese Option auf das ForeignKey-Feld.

Es scheint sehr ineffizient, eine Hin- und Rückfahrt in die Datenbank zu machen zu haben, um ein Objekt zu erhalten, die ID zu bekommen (was ich habe bereits). Ich verstehe, dass das Ausführen der Rundreise bestätigt, dass die ID in der Datenbank vorhanden ist. Aber, hey ... deshalb benutze ich ein RDBMS und habe in erster Linie Fremdschlüssel.

Dank

+0

Große, klassische SO-ish-Frage. – trpt4him

Antwort

20
new_bar = Bar(info="something important", foo_id=12345) 
new_bar.save() 

Sie auch foreign key values directly bekommen. Irgendeine Art von Optimierung.

+0

Das funktionierte ... Ich hatte immer noch Probleme, bis ich etwas herausgefunden hatte. Gehen Sie hier 1 kleine Notiz hinzufügen und bearbeiten Sie die Antwort oben. In meinem obigen Beispiel war ich eigentlich ein wenig zu vereinfachen. In den REAL-Modellen war "foo" der Primärschlüssel der Tabelle nicht "id". Und das Ausland war nicht "foo_id". Aber Sie müssen immer noch den Feldnamen + "_ id" verwenden, um es zum Laufen zu bringen. –

+1

Ist das nicht seltsam, dass es kein doppelter Unterstrich ist, da id ein Feld von Foo ist. Sie verwenden mindestens einen doppelten Unterstrich in Abfragegruppen. – radtek

+0

@radtek das ist, weil Sie Foo's ID-Feld nicht verwenden, verwenden Sie Bar foo_id Feld. Wenn Sie eine Art Datenbank-Client verwenden, sehen Sie, dass 'appname_foo' eine Spalte' id' und 'appname_bar' eine Spalte' foo_id' hat. Ich meine sonst, wie würdest du wissen, welcher Foo zu jeder Bar geht? In diesem Fall würden Sie sogar in Abfragegruppen NICHT (und sollten NICHT) einen doppelten Unterstrich verwenden, wenn Sie mit IDs arbeiten (Sie vermeiden einen Join auf diese Weise). – semicolon