Как расширить User (AbstractBaseUser) с помощью OneToOneField?

#python #django #django-models

#python #django #django-модели

Вопрос:

Я хочу связать модель моего профиля с моделью пользователя из класса AbstractUserModel с помощью OneToOneFields. Возможно ли это? Или любое решение этой проблемы. Здесь мой models.py

 from django.db import models
#from django.contrib.auth.models import User
from django.contrib.auth.models import (
    AbstractBaseUser
)


class User(AbstractBaseUser):
    email       = models.EmailField(max_length=255, unique=True)
    active      = models.BooleanField(default=True) 
    staff       = models.BooleanField(default=False)
    admin       = models.BooleanField(default=False) 
    timestamp   = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active



class Profile(models.Model):
    #HERE
    user                = models.OneToOneField(AbstractBaseUser, on_delete=models.CASCADE)
    nama_lengkap        = models.CharField(max_length=100, blank=True, null=True)
    tgl_lahir           = models.DateField(null=True, blank=True)
    alamat              = models.CharField(max_length=255)
    foto_profil         = models.ImageField(upload_to='foto_profil',blank=True)
    jabatan             = models.ForeignKey(Jabatan, on_delete=models.CASCADE)

    def __str__(self):
        return "{} - {}".format(self.user, self.nama_lengkap)
  

когда я переношу это, просто отобразите сообщение об ошибке, подобное этому:

SystemCheckError: проверка системы выявила некоторые проблемы:

ОШИБКИ: пользователи.Поле Profile.user: (fields.E300) определяет связь с моделью ‘AbstractBaseUser’, которая либо не установлена, либо является абстрактной. Пользователи.Profile.user: (fields.E307) Поле users.Profile.user был объявлен с отложенной ссылкой на ‘auth.abstractbaseuser’, но приложение ‘auth’ не предоставляет модель ‘abstractbaseuser’.

заранее спасибо

Комментарии:

1. добавили ли вы AUTH_USER_MODEL = 'users.User' в свой settings.py ??

2. Нет, это необходимо?

3. Да, поскольку вы используете пользовательскую модель пользователя

Ответ №1:

вам нужно заменить это

 user                = models.OneToOneField(AbstractBaseUser, on_delete=models.CASCADE)
  

с помощью

 user                = models.OneToOneField(User, on_delete=models.CASCADE)
  

Комментарии:

1. по-прежнему нет выбора «User», когда я пытаюсь добавить строку профиля через localhost: 8000/admin /users /profile /add/

2. добавили ли вы какого-либо пользователя в свою базу данных?

3. в phpmyadmin у меня есть auth_user и users_user.

4. вы создали какого-либо пользователя в своей таблице user или нет?

Ответ №2:

Однако я рекомендую вам сделать это по-другому: вместо создания второй модели пользователя расширьте существующую:

 #models.py
class ProfileUser(AbstractUser):
    extra_field = models.CharField(max_length=100)
    username = models.CharField(max_length=20) # modifing existing field
```
```
#settings.py
AUTH_USER_MODEL = "app_name.ProfileUser"