django: как запретить доступ к БД в функции - PullRequest
0 голосов
/ 11 марта 2019

Контекст: наш проект имеет сериализаторы DRF, охватывающие отношения ForeignKey.Поэтому, когда я получаю ListView своих объектов, я получаю дополнительный удар по БД для каждого объекта, то есть список из 100 элементов дает мне 100 дополнительных запросов к БД.Нехорошо.Чтобы исправить это, я использую select_related / prefetch_related в своих представлениях, чтобы выполнить необходимые объединения перед сериализацией.

Проблема : Трудно идти в ногу со всеми select_relatedв представлениях, особенно когда разные разработчики работают с одинаковыми функциями и сериализаторами.Поэтому мне было интересно, есть ли способ запретить доступ к БД в функции (будь то просмотр или метод сериализатора и т. Д.).Первая идея заключалась в том, чтобы обернуть его в декораторе, который считает connection.queries, но этот счетчик всегда пуст в производстве (когда DEBUG=False).

Так есть ли другой способ подсчета запросов в БД, когда DEBUG равен False?

1 Ответ

1 голос
/ 11 марта 2019

Попытка украсить методы и классы ограничением запросов к базе данных кажется мне совершенно неправильным подходом. Если вы хотите внимательно следить за количеством запросов к базе данных, выполняемых вашими представлениями, вам следует использовать модульные тесты.

У Django есть тестовое утверждение для подсчета запросов:

with self.assertNumQueries(2):
    response = self.client.get(my_url)

, который удостоверится, что есть только 2 дБ запросов для извлечения этого конкретного представления.

...