2013-03-18 67 views
0

工作一個django項目並嘗試加速調用。我注意到,Django自動執行第二個查詢來消除任何外鍵關係。舉例來說,如果我的模型看起來像:Django推遲外鍵查找

Model Person: 
    name = model.CharField("blah") 

Model Address: 
    person = model.ForeignKey(Person) 

然後我做:

p1 = Person("Bob") 
address1 = Address(p1) 
print (p1.id) #let it be 1 cause it is the first entry 

然後當我打電話:

address1.objects.filter(person_id = "1") 

我得到:

查詢#1:SELECT addressid,address.person_id FROM address

查詢#2:選擇personid,person.name FROM person

我想擺脫第二個調用,查詢#2。我曾嘗試使用django文檔中的「延遲」,但這並不奏效(實際上它會調用更多)。 「價值觀」是一種可能性,但在實踐中,我想要拉動更多的領域。我希望它做的唯一事情不是評估FOREIGN KEY。我會很高興得到person_id,或不。這極大地減少了運行時間,尤其是當我執行像Address.objects.all()這樣的命令時,因爲Django會評估每個外鍵。

回答

0

剛剛在同一個問題上看到你的其他問題,我猜測你已經定義了引用ForeignKey字段的__unicode__方法。如果您在shell中查詢某些對象並輸出它們,將會調用__unicode__方法,這需要查詢來獲取ForeignKey。解決方法是重寫該方法,以便它不需要該引用,或者 - 正如我在其他問題中所述 - 使用select_related()

下一次,請提供完整的代碼,包括一些實際上證明您遇到問題的代碼。

+0

我發現我的__unicode__確實引用了self.house.id。這似乎清除了問題!謝謝。由於沒有足夠的聲譽,我不能滿足感,但是可以應付這種感覺的人! – user1639926 2013-03-19 00:12:54

+0

謝謝。你仍然可以接受答案。 – 2013-03-19 07:04:57