2017-04-13 3 views
0

Ich muss eine Zeile aus der Tabelle Type1 mit zwei Zeilen aus der Tabelle Type2 verbinden. Es gibt beispielsweise Modelle der Datenbank:Verknüpfen mit mehr als einer, spezifische Eins-zu-viele Zeilen

class Type1(models.Model): 
    name = models.CharField(max_length=300) 

class Type2(models.Model): 
    foreign = models.ForeignKey(Type1) 
    name = models.CharField(max_length=50) 
    value = models.IntegerField() 

In SQL sieht Abfrage wie folgt:

SELECT A.name, B.value, C.value 
FROM Type1 A, Type2 B, Type2 C 
WHERE B.foreign = C.foreign = A.id 
AND B.name = _VAR1_ AND C.name = _VAR2_ 

Wie diese Abfrage tun Methoden Django (nicht roh SQL!)?

Antwort

0

Nicht sicher, ob ich Ihre Frage richtig verstehe, und sehr wenig SQL zu verstehen, um den SQL-Code zu verstehen.

Interpretation 1 ist eine reverse Beziehungsabfrage und ein Q-Objekt für den OR-Teil. Siehe 'Lookups, die sich über die Beziehung erstrecken' und 'Komplexe Lookups mit Q-Objekten' auf der Seite this.

Ex.

Type1.objects.filter(Q(type2__name = '_VAR1_' | type2__name = '_VAR2_')) 

Diese Rückkehr alle Zeilen von Modell Typ1, die VAR1 oder VAR2 für einen zugeordneten Namen Type2 Reihe mit Wert hat.

Interpretation 2: Sie möchten die Beziehung definieren. Nun, das ist einfacher. Sie haben eine Type1-Zeile und möchten zwei andere Zeilen mit dieser Zeile verknüpfen. Fragen Sie die Zeile Type1 ab und speichern Sie sie in einer Variablen.

t1 = Type1.object.get(id = X) 

Dann Typ2 Objekte mit t1 Objekt im Fremdschlüssel erstellen:

t2 = Type2(foreign = t1, name = 'whatever', value = 'value') 
t2.save() 

und das gleiche für das andere Objekt

t3 = Type2(foreign = t1, name = 'whatever2', value = 'value2') 
t3.save() 

Lassen Sie mich wissen, ob ich die Frage falsch verstanden.

Prost.

+0

Danke für die Antwort. Ich werde mein Problem beschreiben: für jedes gibt es nur ein und nur ein . Ich möchte Tabelle (QuerySet) mit Informationen von allen erhalten. Es sollte folgende Spalten haben (Elemente?) - [x.name, y1.value, y2.value] –

+0

Etwas wie Type2.objects.filter (type2__name = _VAR1 _). Values ​​('name', 'type2__value') und Type2. objects.filter (type2__name = _VAR2 _). values ​​('name', 'type2__value') kombiniert –

+0

Sie kennen also das vorhang rechts? Nehmen Sie eine Abfrage vor und speichern Sie sie in einer Variablen: t1 = Type1.objects.get (id = x). Als nächstes machen Sie eine Abfrage auf Type2, um Ihre zwei Zeilen zurückzugeben: t2 = Type2.objects.filter (Q (Fremdschlüssel = t1, Name = VAR1 | Fremdschlüssel = t1, Name = VAR2)). Wenn Sie nur zwei Assoziationen haben, wie Sie gesagt haben, gibt dies eine Liste mit zwei Zeilen zurück, die Sie wollen. Ihre endgültige Liste wird [t1.name, t2 [0] .value, t2 [1] .value] sein. – Tico

Verwandte Themen