2011-04-09 67 views
1

有沒有辦法告訴Django在實例化模型實例時不要遵循外鍵關係?有什麼東西可以放在模型本身上?有什麼要傳遞給查詢集?我想有一個查詢集只返回具有外鍵id的實例 - 我不希望這些實例停止查詢以找到它的親屬。與select_related相反的東西?告訴django不要關注外鍵?

回答

3

的Django的默認行爲是要等到一個外鍵關係進行數據庫查詢來填充相關的模型實例之前訪問。

爲了側向自動查詢相關實例,而不是直接訪問ForeignKey字段屬性,可以訪問attribute_id(例如,

class Person(models.Model): 
    name = models.CharField(max_length=200) 
    user = models.ForeignKey('auth.User') 

# access the user id via user_id 
person = Person.objects.all()[0] 
print person.user_id 
+0

我一直無法找到這個記錄,但似乎'等到外部關鍵字被訪問'的行爲只有在外鍵關係與同一個應用程序中的模型一致的情況下才有效。如果外鍵鏈接到應用程序之外的模型,django會在模型實例化後立即選擇。我錯了嗎?這看起來很糟糕。編輯:用debugsqlshell查看一些測試用例。 – Bacon 2011-04-09 22:23:48

+0

是的,您錯了,相關模型的相關應用程序並不重要,默認情況下,相關實例的信息在獲取相關屬性之前不會被檢索到。 – 2011-04-09 22:27:32

+0

好吧 - 你是對的。我使用django-debug-toolbar來觀察執行的SQL。看起來ddt中存在一個導致上述行爲的錯誤(如果它不在當前模型的應用程序中,它會遵循外鍵關係)。我把ddt關了,現在一切都很好。 – Bacon 2011-04-09 22:58:01

0

嘗試defer

+0

延遲將無法工作(有我的問題不是由錯誤引起的...見下文),因爲我想外鍵的ID,我只是不想外鍵對象本身。 – Bacon 2011-04-09 23:00:19