Получить экземпляр пользователя из модели профиля __str__ в django - PullRequest
0 голосов
/ 18 мая 2019

У меня есть эта простая модель:

class Profile(models.Model):
bio             = models.CharField(max_length=300, blank=False)
location        = models.CharField(max_length=50, blank=
edu             = models.CharField(max_length=250, blank=True, null=False)
profession      = models.CharField(max_length=50, blank=True)
profile_image   = models.ImageField(
    upload_to=upload_image, blank=True, null=False)

def __str__(self):
    try: 
        return str(self.pk)
    except:
        return ""

и модель пользователя:

class User(AbstractBaseUser, UserTimeStamp):
    first_name  = models.CharField(max_length=50, blank=False, null=False)
    email       = models.EmailField(unique=True, blank=False, null=False)
    profile     = models.OneToOneField(Profile, on_delete=models.CASCADE)
    uuid        = models.UUIDField(
        db_index=True,
        default=uuid_lib.uuid4,
        editable=False
    )
    is_admin    = models.BooleanField(default=False, blank=False, null=False)
    is_staff    = models.BooleanField(default=False, blank=False, null=False)
    is_active   = models.BooleanField(default=True, blank=False, null=False)

    objects     = UserManager()

    USERNAME_FIELD = "email"

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, perm_label):
        return True

Как вы можете видеть в модели пользователя, у меня есть OneToOneField to Profile.

, но в модели профиля я не могу получить доступ к экземпляру пользователя, чтобы просто использовать его электронную почту в методе str .как то так:

def __str__(self):
    return self.user.email

Как я могу это сделать?иногда эти отношения сбивают меня с толку.

ОБНОВЛЕНО

Да, self.user.email работает хорошо.но проблема в другом.У меня есть два типа пользователей.пользователи и учителя.и каждый из них имеет профиль поля в своей модели.поэтому, если я скажу:

def __str__(self):
    return self.user.email

Он просто возвращает электронную почту пользовательских экземпляров.а учителя?

1 Ответ

0 голосов
/ 18 мая 2019

модель пользователя:

class User(AbstractBaseUser, UserTimeStamp):
    profile     = models.OneToOneField(Profile, on_delete=models.CASCADE, related_name='user_profile')

модель учителя:

class Teacher(AbstractBaseUser, UserTimeStamp):
    profile     = models.OneToOneField(Profile, on_delete=models.CASCADE, related_name='teacher_profile')

модель профиля:

def __str__(self):
    if hasattr(self, 'user_profile'):
          # profile belong to user
          print(self.user_profile.pk)
    elif hasattr(self, 'teacher_profile'):
          # profile belong to teacher
          print(self.teacher_profile.pk)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...