2017-05-24 99 views
1

我有3個模型temp1,temp2,temp3其中temp1和temp2有外鍵到temp3.id。這意味着temp1和temp2通過temp3.id關聯。通過另一個模型加入2個模型,他們有一個外鍵

Class temp1(models.Model): 
    temp3 = models.ForeignKey('temp3', verbose_name=u"temp3", null=True, blank=True) 
    i_y = models.IntegerField('i_Y',null=True, blank=True) 
    iq = models.FloatField('IQ', null=True, blank=True) 



class temp2(models.Model): 
    temp3 = models.ForeignKey('temp3', verbose_name=u"temp3", null=True, blank=True) 
    q_y = models.IntegerField('Y', null=True, blank=True) 
    eq = models.IntegerField('EQ', null=True, blank=True) 
    q_c = models.CharField('category', max_length=1000, null=True, blank=True) 


class temp3(models.Model): 
    title = models.CharField(_('Title'), max_length=400, null=True, blank=True) 

我如何使用django ORM對temp1和temp2模型進行全外連接? 事實上,我想要做一個SQL查詢這樣的Django的ORM:

select temp3.title, temp1.i_y, temp1.iq, temp2.eq,temp2.q_c, temp2.q_y from (select temp1.i_y, temp1.iq, temp1.temp3_id AS first_table_id,temp2.temp3_id AS second_table_id,temp2.eq, temp2.q_c, temp2.q_y from temp1 full outer join temp2 on (temp1.temp3_id = temp2.temp3_id AND temp1.i_y = temp2.q_y)) AS t left outer join temp3 (t.first_table_id = temp3.id OR t.second_table_id = temp3.id) 

我應該指出,對於TEMP3的每一行,有對db temp1目錄和TEMP2車型多行,我的目標是獲取所有的行這是由連接條件滿足

+1

爲什麼不使用ManyToManyFields與參數。這會更容易使用,因爲django默認在其ORM中提供了很多查詢集https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_many/ –

回答

0

你可以讓你的相關TEMP3,然後得到提到這個TEMP3一套所有TEMP2的:

t1 = temp1.objects.first() 
t3 = t1.temp3 
t2_set = t3.temp2_set.all() 

,或者在一個行:

t2_set = temp1.objects.first().temp3.temp2_set.all() 

但正如Michael所說,如果可能的話,您應該使用Many2Many字段。

+0

first()函數做了什麼? – Mehdi

+0

第一個函數只是從數據庫中獲取第一個對象。用你需要的方法替換它,例如all()作爲完整列表,或get(key = value)。 –

相關問題