@kait123

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Djangoのuserクラスの拡張について

解決したいこと

Djangoで従業員を管理するアプリを作っています。
Userモデルを拡張したものを複数使ってログインの処理がしたいです。

発生している問題・エラー

AUTH_USER_MODEL にてUserモデルを複数指定しても片方しか反映されません

該当するソースコード

AUTH_USER_MODEL = 'A.User'
AUTH_USER_MODEL = 'B.User2'
#models.py
#Aフォルダ
class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    uuid = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        blank=True,
        null=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    email = models.EmailField(_('メールアドレス'), unique=True,null=True)

    is_staff = models.BooleanField(
        _('staff status'),
        default=True,
        help_text=_('Designates whether the user can log into this admin site.'),
    )

    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        db_table = 'User'
        verbose_name = _('user')
        verbose_name_plural = _('ユーザー')

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def email_user(self, subject, message, from_email=None, **kwargs):
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def get_uuid(self):
        return self.uuid
   #models.py
   #Bフォルダ
   #上記と殆ど同じため割愛
   class Meta:
        db_table = 'User2'
        verbose_name = _('user')
        verbose_name_plural = _('ユーザー')

自分で試したこと

AUTH_USER_MODEL =["A.User","B.User2"]
などを試したが反映されず

setteing.py
|A--models.py(A.User)
|B--models.py(B.User2)

Django version 3.1.6

0 likes

1Answer

AUTH_USER_MODELに複数のクラスを設定することはできません。
ですが、複数のクラスを設定したい理由を説明いただければ、代案を出せるかもしれません。
ほとんどUserとUser2が同じだとソース上も記載があるので、複数のクラスを設ける意味を読み取れませんでした。

たとえば、異なるfieldを持つ投稿者、閲覧者みたいなモデルをログイン時も使いたいのであれば以下のような対応で可能です。

  • ベースとなる「ユーザ」モデルを作る
  • 「投稿者」モデル、「閲覧者」モデルは「ユーザ」モデルを継承する
  • AUTH_USER_MODELには「ユーザ」モデルを指定する
0Like

Your answer might help someone💌