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
Г

C++ - Тест 001. Первая программа и типы данных

  • Результат:66бали,
  • Рейтинг балів-1
t

C++ - Тест 001. Первая программа и типы данных

  • Результат:33бали,
  • Рейтинг балів-10
t

Qt - Тест 001. Сигналы и слоты

  • Результат:52бали,
  • Рейтинг балів-4
Останні коментарі
G
GoattRock03 вересня 2024 р. 23:50
Як скопіювати файли в Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
Влад Русоков02 серпня 2024 р. 11:47
Як скопіювати файли в Linux Screenshot_20240802-065123.png
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr09 лютого 2024 р. 05:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 12:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
Fynjy22 липня 2024 р. 14:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCT25 червня 2024 р. 11:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCT05 травня 2024 р. 15:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi03 травня 2024 р. 00:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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