2011-11-04 48 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调试工具栏。