django:这导致了多少查询?

时间:2011-11-04 19:04:11

标签: python sql django performance

说我有以下型号:

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足够智能只在这里做一个查询?

3 个答案:

答案 0 :(得分:4)

这将需要3个查询。

得到foo,bar和baz。

使用select_related()立即获取它们。

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

答案 1 :(得分:2)

有一种快速的说法。安装Django工具栏。然后查看查询选项卡。它会为您提供各种分析信息。

虽然我相信每个FK呼叫+1查询

答案 2 :(得分: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调试工具栏。