Как получить доступ к модели, связанной с пользователем в DJango - PullRequest
0 голосов
/ 30 марта 2020

Я хотел бы получить доступ к модели, связанной с пользователем в User. Я знаю, что можно получить имя пользователя или имя пользователя, используя: request.user.get_username () model.py

class Profile(models.Model):

  profile_user   =  models.OneToOneField(User, null=True, on_delete=models.CASCADE)
  profile_note   =  models.CharField(max_length=30,...)

Есть ли любой метод, чтобы взять связанное поле модели без запроса? Пример: request.user.profile.profile_note

1 Ответ

1 голос
/ 30 марта 2020

Если вы хотите, чтобы request.user всегда имел доступ к .profile без дополнительного запроса, вы можете написать свой собственный аутентификационный бэкэнд , который использует select_related при поиске пользователя, чтобы была только 1 база данных query

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

class ProfileBackend(ModelBackend):
    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel._default_manager.select_related('profile').get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

settings.py

AUTHENTICATION_BACKENDS = [
    'app.backends.ProfileBackend',
]

Теперь, когда из базы данных загружается request.user, профиль будет загружен в тот же запрос. Теперь вы можете получить доступ к request.user.profile.profile_note без каких-либо дополнительных запросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...