【问题标题】:django: how many queries does this cause?django:这会导致多少查询?
【发布时间】:2011-11-04 19:04:10
【问题描述】:

假设我有以下模型:

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

【问题讨论】:

    标签: python sql django performance


    【解决方案1】:

    这将需要 3 个查询。

    获取 foo、bar 和 baz。

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

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

    【讨论】:

      【解决方案2】:

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

      虽然我相信每次 FK 调用 +1 查询

      【讨论】:

        【解决方案3】:

        这是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 调试工具栏。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-16
          • 2017-08-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多