2015-12-28 5 views
3

У меня есть следующие функции, чтобы определить, кто загрузил определенную книгу:Оптимизированный Django QuerySet

@cached_property 
def get_downloader_info(self): 
    return self.downloaders.select_related('user').values(
     'user__username', 'user__full_name') 

Поскольку я только с помощью двух полей, имеет ли смысл использовать .defer() на остальных полях?

Я пытался использовать .only(), но я получаю сообщение об ошибке, что некоторые поля не являются сериализуемыми JSON.

Я открыт для всех предложений, если таковые имеются, для оптимизации этого набора запросов.

Спасибо!

+0

вы проверить запрос, который генерируется? Пример: 'self.downloaders.select_related ('user'). Values ​​( 'user__username', 'user__full_name'). Query' вы можете проанализировать это, чтобы убедиться, что это действительно стоит оптимизировать. – karthikr

+0

@karthikr Где бы я нашел вывода, чтобы определить, следует ли его оптимизировать? – jape

+0

какой бэкэнд базы данных вы используете? –

ответ

1

Перед тем, как попробовать любую возможную оптимизацию, вы должны получить SQL-запрос, сгенерированный ORM (вы можете print it to stdout или использовать что-то вроде django debug toolbar) и посмотреть, что происходит медленно. После этого я предлагаю вам запустить этот запрос с помощью EXPLAIN ANALYZE и узнать, что медленнее в этом запросе. Если запрос медленный, потому что много данных должно быть передаточным, чем имеет смысл использовать only или defer. Использование only и defer (или values) дает вам лучшие результаты только в том случае, если вам нужно получить много данных, но это не делает работу с базой данных намного проще (если вам действительно не нужно читать много данных, конечно).

Поскольку вы используете Django и Postgresql, вы можете получить Psql сеанс с manage.py dbshell и получить тайминги запросов с \timing

+0

Даже если это только помогло немного, не имеет смысла оптимизировать все возможные аспекты? Я просто установил панель инструментов Django Debug, так что спасибо. – jape