2011-11-04 51 views
1

說我有以下型號:django:這會導致多少個查詢?

class Baz(models.Model): 
    winning = models.CharField(max_length=100) 

class Bar(models.Model): 
    baz = models.ForeignKey(Baz) 

class Foo(models.Model): 
    bar = models.ForeignKey(Bar) 

現在我有Foofoo一個實例。以下行執行多少個查詢?

winning = foo.bar.baz.winning 

它做一個對每一個外鍵.,或者是Django的足夠聰明,只能做一個查詢嗎?

回答

4

這將需要3個查詢。

一個得到foo,bar和baz。使用select_related()立即得到它們。

Foo.objects.get(id=1).select_related('bar__baz__winning') 
2

有一個快速的方法來告訴。安裝Django工具欄。然後檢查查詢標籤。它會給你各種分析信息。

雖然我相信每FK通話+1查詢

1

這裏是winning = foo.bar.baz.winning語句查詢:(我'不算Foo.objects .. statemnt)

(0.000) SELECT "foo_bar"."id", "foo_bar"."baz_id" FROM "foo_bar" WHERE "foo_bar"."id" = 1 ; args=(1,) 
(0.000) SELECT "foo_baz"."id", "foo_baz"."winning" FROM "foo_baz" WHERE "foo_baz"."id" = 1 ; args=(1,) 

這裏是我的建議:添加日誌記錄在django.db.backends您的設置。 https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends

而且您會在控制檯中看到所有查詢。或者像Francis建議你那樣安裝Django調試工具欄。