django: сколько запросов это вызывает?

#python #sql #django #performance

#питон #sql #джанго #Производительность #python #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)
  

Теперь у меня есть пример Foo , foo . Сколько запросов выполняется в следующей строке?

 winning = foo.bar.baz.winning
  

Выполняет ли он по одному для каждого внешнего ключа . , или Django достаточно умен, чтобы выполнить здесь только один запрос?

Ответ №1:

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

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

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

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

Ответ №2:

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

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

Ответ №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

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