Django: сколько запросов это вызывает? - PullRequest
1 голос
/ 04 ноября 2011

Скажем, у меня есть следующие модели:

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 достаточно умен, чтобы выполнить только один запрос здесь?

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Для этого потребуется 3 запроса.

Один, чтобы получить foo, bar и baz.

Используйте select_related(), чтобы получить их сразу.

Foo.objects.get(id=1).select_related('bar__baz__winning')
2 голосов
/ 04 ноября 2011

Есть быстрый способ узнать.Установите Django Toolbar.Тогда проверьте вкладку запросов.Это даст вам все виды информации о профилировании.

Хотя я считаю, что +1 запрос на вызов FK

1 голос
/ 04 ноября 2011

Вот запросы для 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

И вы увидите все свои запросы в своей консоли. Или установите панель инструментов отладки Django в соответствии с предложением Фрэнсиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...