programing

장고에서 추상 사용자와 추상 기본 사용자의 차이점은 무엇입니까?

linuxpc 2023. 5. 16. 22:12
반응형

장고에서 추상 사용자와 추상 기본 사용자의 차이점은 무엇입니까?

AbstractUser그리고.AbstractBaseUser꽤 비슷해 보입니다.

from django.contrib.auth.models import AbstractUser, AbstractBaseUser

둘 사이의 차이점은 무엇입니까?

설명서는 이를 충분히 설명합니다. AbstractUser필드가 포함된 완전한 사용자 모델로, 추상 클래스에서 상속하고 자신의 프로파일 필드 및 메서드를 추가할 수 있습니다. AbstractBaseUser에는 인증 기능만 포함되어 있지만 실제 필드는 포함되어 있지 않습니다. 하위 분류할 때 필드를 제공해야 합니다.

AbstractUser는 기본적으로 이미 익숙한 "사용자" 클래스입니다.AbstractBaseUser는 사용자 이름을 나타내는 필드, 필요한 필드 및 이러한 사용자를 관리하는 방법을 알려주어야 합니다.

기존 사용자(예: 추가 필드가 있는 프로필 데이터)에 항목을 추가하는 경우, AbstractUser를 사용하는 것이 더 간단하고 쉽습니다.인증에 대한 Django의 몇 가지 가정을 다시 생각해 보고 싶다면, AbstractBaseUser는 그렇게 할 수 있는 권한을 제공합니다.

먼저 AbstractUser와 AbstractBaseUser에 대해 설명하겠습니다.

<사용자 추상화>

"AbstractUser" 클래스에는 처음에 아래와 같이 기본 "User" 클래스와 동일한 11개의 필드가 있으며, "AbstractUser" 클래스의 하위 클래스의 경우 새 필드를 추가하고, 초기 필드를 변경 및 제거할 수 있습니다.*"AbstractUser" 클래스의 초기 필드에 있는 "username" 및 "email" 필드특별하며 "username" 필드에만 고유 제약 조건이 있습니다.

아래와 같이 기본 "User" 클래스에 있는 "AbstractUser" 클래스의 초기 필드입니다.

id
password
last_login
is_superuser
username (Special, Unique Constraint)
first_name
last_name
email (Special)
is_staff
is_active
date_joined

이제 아래와 같이 "CustomUser(AbstractUser)" 클래스에 "pass"를 설정합니다.

# "account/models.py"

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "AbstractUser" 클래스의 초기 필드가 SQLite에 생성됩니다.

여기에 이미지 설명 입력

그런 다음 "CustomUser(AbstractUser)" 클래스에 대해 아래와 같이 "연령" 및 "성별" 필드를 설정합니다.

# "account/models.py"

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    age = models.IntegerField()
    gender = models.CharField(max_length=100)

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "Age" 및 "gender" 필드가 "AbstractUser" 클래스 초기 필드로 만들어집니다.

여기에 이미지 설명 입력

그런 다음 "모델"을 설정하여 "AbstractUser" 클래스의 모든 초기 필드를 변경합니다.CharField(max_length=100)"는 기본 키를 가지지만 "id" 필드에는 "primary_key=True"가 필요합니다. 그렇지 않으면 오류가 발생하고 "unique=True" 필드에는 고유 제약 조건을 가지려면 "unique▁toTrue"가 필요합니다. 그렇지 않으면 경고가 발생합니다.

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):           # ↓ Here ↓
    id = models.CharField(max_length=100, primary_key=True)
    password = models.CharField(max_length=100)
    last_login = models.CharField(max_length=100)
    is_superuser = models.CharField(max_length=100) # ↓ Here
    username = models.CharField(max_length=100, unique=True)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
    is_staff = models.CharField(max_length=100)
    is_active = models.CharField(max_length=100)
    date_joined = models.CharField(max_length=100)

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 "AbstractUser" 클래스의 모든 초기 필드가 다음과 같이 변경됩니다.

여기에 이미지 설명 입력

그런 다음 아래와 같이 "없음"으로 설정하여 "비밀번호", "last_login", "is_superuser" 및 "username" 필드를 제거합니다.*"없음"을 설정하더라도 "id" 필드는 절대 제거될 수 없으며 USERNAME_FIELD에는 기존 필드가 하나 있어야 하며 기본적으로 고유 제약 조건이 있는 "username" 필드USERNAME_FIELD로 설정되므로 "없음"을 설정하여 "username" 필드를 제거할 경우,또한 아래와 같이 기존 필드 하나를 설정하여 USERNAME_FIELD에서 "username" 필드를 제거해야 합니다. 그렇지 않으면 오류가 발생하므로 아래 예제에서는 기존 필드 "id", "first_name", "last_name", "email", "is_staff", "is_active" 및 "date_field"를 선택하면 아래와 같이 "unique=True" 사용하여 "last_name" 필드를 "username_FIEL" 필드에서 "last_name" 필드변경할 수 있습니다.*"last_name" 필드와 마찬가지로 "USERNAME_FIELD"로 설정된 기존 필드는 아래와 같이 "unique=True"가 고유 제약 조건을 가져야 합니다. 그렇지 않으면 "id" 필드에 "USERNAME_FIELD"로 기본 키를 설정할 때 "unique=True"가 고유 제약 조건을 가질 필요가 없습니다.

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    password = None
    last_login = None
    is_superuser = None
    username = None                              # Here
    last_name = models.CharField(max_length=150, unique=True)
    
    USERNAME_FIELD = 'last_name' # Here

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "password", "last_login", "is_superuser" 및 "username" 필드가 제거되고 "last_name" 필드에 고유 제약 조건이 있습니다.

여기에 이미지 설명 입력

다음에도 "비밀번호", "last_filename", "is_superuser" 및 "filename" 필드를 아래와 같이 "없음"으로 설정하여 제거하지만, 이번에는 "unique=True" 포함된 "email" 필드를 아래와 같이 "USERNAME_FIELD" 필드로 변경합니다.*기본적으로 "email" 필드도 "REquired_FIELDS"로 설정되어 있으며 동일한 필드를 "USERNAME_FIELDS"와 "REquired_FIELDS"로 동시에 설정할 수 없습니다. 그렇지 않으면 "REquired_FIELDS"에서 "email" 필드를 제거하는 오류가 발생하므로 아래와 같이 "REquired_FIELDS"로 설정하지 마십시오.*아래와 같이 "REQUESTED_FIELDS"로 설정된 필드는 없습니다.

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    password = None
    last_login = None
    is_superuser = None
    username = None           # Here               
    email = models.EmailField(unique=True)

    USERNAME_FIELD = 'email' # Here
    REQUIRED_FIELDS = [] # Here

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "password", "last_login", "is_superuser" 및 "username" 필드가 제거되고 "email" 필드에 고유 제약 조건이 있습니다.

여기에 이미지 설명 입력

아래 코드는 GithubDjangoo에 있는 "AbstractUser" 클래스의 일부입니다.정의필드인 USERNAME_FIELD = "fields", REQUESTED_FIELDs = ["email"] "AbstractUser" 클래스실제로 "AbstractBaseUser" 클래스의 하위 클래스이며 다음으로 설명합니다.

# "django/contrib/auth/models.py"

class AbstractUser(AbstractBaseUser, PermissionsMixin):

    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _("username"),
        max_length=150,
        unique=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."),
        },
    )
    first_name = models.CharField(_("first name"), max_length=150, blank=True)
    last_name = models.CharField(_("last name"), max_length=150, blank=True)
    email = models.EmailField(_("email address"), blank=True)
    is_staff = models.BooleanField(
        _("staff status"),
        default=False,
        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."
        ),
    )
    date_joined = models.DateTimeField(_("date joined"), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = "email"
    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["email"]

<기본 사용자 추상화>

"AbstractBaseUser" 클래스에는 처음에 아래와 같이 3개의 필드가 있으며 "AbstractBaseUser" 클래스의 하위 클래스에 대해서는 "AbstractUser" 클래스와 동일하게 새 필드를 추가하고, 초기 필드를 변경 및 제거할 수 있습니다.

아래와 같이 "AbstractBaseUser" 클래스의 초기 필드는 다음과 같습니다.

id
password
last_login

이제 아래와 같이 "unique=True"를 가진 "password" 필드 "CustomUser(AbstractBaseUser)" 클래스의 "USERNAME_FIELD" 설정합니다.*이미 알고 있듯이 "AbstractBaseUser" 클래스에도 "USERNAME_FIELD"가 있으며 기본적으로 필드가 "USERNAME_FIELD"로 설정되어 있지 않으므로 아래와 같이 기존 필드 하나를 설정해야 합니다. 그렇지 않으면 오류가 발생합니다.또한 "REQUESTED_FIELDS"로 설정된 필드는 없습니다.

# "account/models.py"

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):        # ↓ Here ↓ 
    password = models.CharField(max_length=128, unique=True)
    # ↓ Here ↓
    USERNAME_FIELD = 'password'

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "AbstractBaseUser" 클래스의 초기 필드가 SQLite에 생성됩니다.

여기에 이미지 설명 입력

그런 다음 "CustomUser(AbstractBaseUser)" 클래스에 대해 "age" 및 "gender" 필드를 설정하고 "unique=True"가 있는 "age" 필드를 아래와 같이 "USERNAME_FIELD" 설정합니다.

# "account/models.py"

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
    age = models.IntegerField(unique=True)
    gender = models.CharField(max_length=100)

    USERNAME_FIELD = 'age'

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 "age" 및 "gender" 필드가 "AbstractBaseUser" 클래스의 초기 필드로 생성되고 고유 제약 조건이 아래와 같이 "age" 필드로 설정됩니다.

여기에 이미지 설명 입력

그런 다음 "모델"을 설정하여 "AbstractBaseUser" 클래스의 모든 초기 필드를 변경합니다.CharField(max_length=100)"를 사용하여 "unique=True"를 "USERNAME_FIELD"로 설정하고 "AbstractUser" 클래스와 동일하게 "id" 필드에 Primary_key=True" 있어야 기본 키가 있고 그렇지 않으면 오류가 발생합니다.

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):       # ↓ Here ↓
    id = models.CharField(max_length=100, primary_key=True)
    password = models.CharField(max_length=100, unique=True)
    last_login = models.CharField(max_length=100)
    
    USERNAME_FIELD = 'password'

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 "AbstractBaseUser" 클래스의 모든 초기 필드변경되고 UniqueConstraint아래와 같이 "password" 필드로 설정됩니다.

여기에 이미지 설명 입력

다음으로, "없음"을 "비밀번호" 및 "last_login" 필드를 제거하고 아래와 같이 기존의 "id" 필드 하나만 "USERNAME_FIELD"설정합니다.*"AbstractUser"와 마찬가지로 "id" 필드는 "없음"으로 설정하고 기본 키가 "USERNAME_FIELD"인 "id" 필드를 "unique=True" 설정해도 제거 없습니다.

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
    password = None
    last_login = None
        
    USERNAME_FIELD = 'id'

그런 다음 아래의 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

그런 다음 아래와 같이 "password" 및 "last_login" 필드가 제거됩니다.

여기에 이미지 설명 입력

아래 코드는 GithubDjango에 있는 "AbstractBaseUser" 클래스의 일부입니다.정의된 필드, "USERNAME_FIELD"가 정의되지 않고 REQUESTED_FIELD = []:

# "django/contrib/auth/base_user.py"

class AbstractBaseUser(models.Model):
    password = models.CharField(_("password"), max_length=128)
    last_login = models.DateTimeField(_("last login"), blank=True, null=True)

    is_active = True

    REQUIRED_FIELDS = []

"AbstractUser" 클래스는 "AbstractBaseUser" 클래스의 하위 클래스이고 "AbstractUser" 클래스는 아래와 같이 기본 "User" 클래스와 동일한 필드가 11개 있습니다.

id
password
last_login
is_superuser
username
first_name
last_name
email
is_staff
is_active
date_joined

"AbstractBaseUser" 클래스는 "AbstractUser" 클래스의 슈퍼 클래스이며 "AbstractBaseUser" 클래스에는 아래와 같이 3개의 필드가 있습니다.

id
password
last_login

주요 차이점은 기본적으로 사용 사례에 있습니다.예를 들어 Django에서 제공하는 기존 사용자 클래스는 더 이상 필요하지 않으며 사용자 클래스와 사용자 정의 필드에서 제공하는 인증 기능에만 관심이 있습니다.이 경우 AbstractBaseUser를 사용해야 합니다.다른 경우에는 기존 사용자 필드 및 기능을 사용하고 추가 필드 및 메서드를 추가할 수 있습니다.이 경우 AbstractUser를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/21514354/difference-between-abstractuser-and-abstractbaseuser-in-django

반응형