#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, как предлагает вам Фрэнсис.