Django - Урок 047. Как сделать select_related и prefetch_related для аутентифицированного пользователя

user, Django, Backend, Model

Представим, что для аутентифицированного пользователя при открытии страниц постоянно выполняются какие-то запросы, например подгружается дополнительно список уведомлений, а также его профиль. И эту информацию мы используем в шаблонах, например таким образом.

{% if user.is_authenticated %}
    {{ user.profile.avatar }}
    {{ user.notices.count }}
{% endif %}

Как profile, так и notices - это модели данных, для которых требуется выполнить запрос к базе данных, а каждый запрос - это дополнительное подключение и дополнительная выборка данных, что увеличивает время отклика сайта. При этом в Django для ускорения выборок используется механизм выборки соответствующих моделей в одном запросе к базе данных.

Получается, что три изначальных запроса можно объединить в один запрос. Но если с обычными моделями всё более-менее понятно, то с объектом аутентифицированного пользователя возникает проблема, поскольку на первый взгляд не ясно, когда и где забираются данные о пользователе.

Ответ: аутентифицированный пользователь забирается в бэкенде аутентификации.

Поэтому нам нужно написать собственный бэкенд аутентификации, чтобы было можно выполнить select и prefetch запросы при поиске пользователя.

Это будет выглядеть следующим образом.

# -*- coding: utf-8 -*-

from django.contrib.auth import get_user_model


class MyBackend:

    def get_user(self, user_id):
        try:
            return get_user_model().objects.select_related('profile').prefetch_related('notices').get(pk=user_id)
        except get_user_model().DoesNotExist:
            return None

А чтобы это заработало, нужно добавить наш бэкенд аутентификации в настройках.

AUTHENTICATION_BACKENDS = (
    'my_app.backends.MyBackend',
    'django.contrib.auth.backends.ModelBackend',
)
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

A
29 марта 2020 г. 12:14
Alexanderv66

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
A
29 марта 2020 г. 12:05
Alexanderv66

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
DE
28 марта 2020 г. 15:13
Denis Erokhin

C++ - Тест 005. Структуры и Классы

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
27 марта 2020 г. 14:40
Евгений Легоцкой

Добрый день. В конце пятой статьи скачать можете.
27 марта 2020 г. 14:28
mkdir _

Здравствуйте, а можно, пожалуйста, ссылку на целые исходники, если есть?
27 марта 2020 г. 4:36
Евгений Легоцкой

Скорее всего также, как и для установки всех остальных переменых в CMake, через использование set
27 марта 2020 г. 2:47
Андрей Янкович

Ошибка с ярлыками в Windows исправлена в версиии 1.4.0.4
Сейчас обсуждают на форуме
30 марта 2020 г. 4:16
Евгений Легоцкой

Попробуйте запустить через плейлист, а не через setMedia. Пример есть в этой статье
30 марта 2020 г. 3:25
Евгений Легоцкой

Добрый день. Почитайте документацию, в исходниках этой библиотеки есть исходнные классы логгеров. Вам наверняка достаточно только правильно вызвать пару функций, чтобы задать имя файла…
30 марта 2020 г. 3:17
Евгений Легоцкой

Нет, не нужно ничего умножать, если у вас включена поддержа High DPI в приложении а QML, то достаточно держать в памяти, что все значения задаются в DPI, и просто задаёте значения равные DPI сра…
27 марта 2020 г. 10:00
Михаиллл

Оказывается нужно сделать столбец уникальным ALTER TABLE public.drivers ADD UNIQUE (agregator1_id); Потом так работает INSERT INTO drivers( name_driver, surname, middle_name, agr…
s
27 марта 2020 г. 8:25
shuric

Спасибо за ответы. Скорее всего оставлю на неопределенное время под macOS. Хоть будет полезно другим начинающим разработчикам.
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB