Saya ingin mengakses model yang terkait dengan pengguna di User. Saya tahu bahwa mungkin untuk mendapatkan nama pengguna atau nama pengguna menggunakan: 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,...)

Apakah ada metode untuk mengambil bidang model terkait tanpa kueri? Contoh: request.user.profile.profile_note

0
VicenteC 30 Maret 2020, 04:11

1 menjawab

Jawaban Terbaik

Jika Anda ingin request.user selalu menyediakan .profile tanpa kueri tambahan, Anda dapat menulis authentication backend yang menggunakan select_related saat mencari pengguna sehingga hanya ada 1 query database

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

Setting.py

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

Sekarang ketika request.user dimuat dari DB, profil akan dimuat dalam kueri yang sama. Anda sekarang dapat mengakses request.user.profile.profile_note tanpa pertanyaan tambahan

1
Iain Shelvington 30 Maret 2020, 01:36