说我有以下型号:
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)
现在我有一个Foo
,foo
的实例。以下行执行了多少个查询?
winning = foo.bar.baz.winning
它是为每个外键.
做一个,还是Django足够智能只在这里做一个查询?
答案 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调试工具栏。