2017-04-13 28 views
0

我必須從表Type1的兩行中連接一行。有數據庫的模型示例:加入多個特定的一對多行

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() 

在SQL中,查詢看起來是這樣的:

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_ 

如何做到使用Django的方法是查詢(而不是原始的SQL!)?

回答

0

不知道我是否正確理解你的問題,並且知道很少的SQL來理解SQL代碼。

解釋1是你想要一個反向關係查詢和一個Q對象的OR部分。請參閱this頁面中的'查找跨度關係'和'使用Q對象進行復雜查找'。

Ex。

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

這種收益模型類型1的所有行具有與價值VAR1VAR2的名稱相關的2型一行。

解釋2:你想定義關係。 好吧,那很容易。你有一個Type1行,並希望將其他兩行與這一行相關聯。 查詢Type1行並將其保存到變量。

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

然後使用T1對象外鍵創建TYPE2對象:

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

與同爲其他對象

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

讓我知道如果我誤解了問題。

乾杯。

+0

感謝您的回覆。我將描述我的問題:對於每個<元素Type1 x>,只有一個<元素Type2 y1與foreign = x和name = _VAR1_>,並且只有一個<元素Type2 y2與foreign = x和name = _VAR2_>。我想接收來自所有人的信息的表(QuerySet)。它應該有以下列(元素?) - [x.name,y1.value,y2.value] –

+0

類似於Type2.objects.filter(type2__name = _VAR1 _)。values('name','type2__value')和Type2。 objects.filter(type2__name = _VAR2 _)。values('name','type2__value')combined –

+0

所以你知道 beforehang right?進行查詢並將其保存到變量:t1 = Type1.objects.get(id = x)。接下來,在Type2上進行查詢以返回兩行:t2 = Type2.objects.filter(Q(foreignkey = t1,name = VAR1 | foreignkey = t1,name = VAR2))。如果你說只有兩個關聯,這將返回一個包含你想要的兩行的列表。你的最終名單將是[t1.name,t2 [0] .value,t2 [1] .value]。 – Tico