Как получить поле из другой модели, связанной отношением OneToOne?

У меня есть основная модель User с полем 'email' (и другими полями). Но я создал еще одну модель Profile, в которую мне нужно передать email пользователя.

models.py для пользователя:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(db_index=True, unique=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']
    objects = UserManager()

и для профиля:

class Profile(models.Model):
    user = models.OneToOneField('authentication.User', on_delete=models.CASCADE)
    phone_number = models.IntegerField(blank=True, unique=True)
    is_subscribed = models.BooleanField(default=False)
    email = ...

Task звучит довольно просто, но использование user.email кажется не работает так же хорошо, как user__email или свойство user.get_email. Что я должен написать вместо ... ?

если модель вам нравится

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(db_index=True, unique=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']
    objects = UserManager()
    
    
class Profile(models.Model):
    user = models.OneToOneField('authentication.User', on_delete=models.CASCADE)
    phone_number = models.IntegerField(blank=True, unique=True)
    is_subscribed = models.BooleanField(default=False)

Вы можете использовать

$ profile = Profile.objects.get(id=1)
$ profile.user.email

А если так

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(db_index=True, unique=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']
    objects = UserManager()
    
    
class Profile(models.Model):
    user = models.OneToOneField('authentication.User', on_delete=models.CASCADE)
    phone_number = models.IntegerField(blank=True, unique=True)
    is_subscribed = models.BooleanField(default=False)
    email = models.EmailField(db_index=True, unique=True)

Вы можете использовать

$ profile = Profile.objects.get(id=1)
$ user = User.objects.get(id=1)
$ user = Test.objects.get(id=1)
Вернуться на верх