Evgenii Legotckoi
Evgenii Legotckoi26 серпня 2019 р. 03:51

Django - Урок 047. Як зробити select_related і prefetch_related для аутентифицированного користувача

Уявімо, що для аутентифицированного користувача ппрі відкритті сторінок постійно виконуються якісь запити, наприклад подгружается додатково список повідомлень, а також його профіль. І цю інформацію ми використовуємо в шаблонах, наприклад таким чином.

{% 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 хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

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

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

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

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall14 листопада 2024 р. 11:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 09:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 листопада 2024 р. 04:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
i
innorwall14 листопада 2024 р. 04:00
PyQt5 - Урок 007. Працює з QML QtQuick (Сигнали та слоти) priligy 30mg Am J Obstet Gynecol 171 1488 505
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 03:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 10:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 04:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах