Просмотр SQL запросов, сделанных Django ORM

Частая задача, которая встаёт при использовании Django в серьёзных проектах - знать, какие именно запросы генерирует Django ORM. Неподготовленного человека просмотр этих SQL запросов (вернее их количества) может привести в шок ) Например, если поле объекта является ForeignKey(null=True), то при выводе этого поля у множества объектов, на каждый объект будет делаться запрос для этого поля и даже select_related() не поможет.

Подобные проблемы решаются различными ухищрениями типа:
- http://web-brains.com/2007/12/06/selecte_related_and_foreign_key/
- http://piranha.org.ua/blog/2007/10/31/related-objects/

Но рассказать я хочу не про ухищрения, о которых и так уже рассказано, а о том, как можно удобно просматривать SQL запросы для каждой конкретной страницы сайта, сделанного на Django.
 

Декоратор для удобного постраничного разбиения

Стандартное решение предлагаемое джанго для постраничного разбиения списка объектов - это класс django.core.paginator.ObjectPaginator

Здесь можно посмотреть примеры использования ObjectPaginator [djangoproject.com]

Однако, использование ObjectPaginator в голом виде не совсем удобно. В самом деле, нужно:
- извлечь номер страницы из GET-данных или URL запроса
- создать QuerySet объектов для пагинации
- создать ObjectPaginator, передав ему этот QuerySet
- получить объекты текущей страницы, путём вызова метода get_page у пагинатора