장고에서 추상 사용자와 추상 기본 사용자의 차이점은 무엇입니까?
의 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" 필드에 고유 제약 조건이 있습니다.
아래 코드는 Github의 Djangoo에 있는 "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" 필드가 제거됩니다.
아래 코드는 Github의 Django에 있는 "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
'programing' 카테고리의 다른 글
기본 64 인코딩 이미지를 디스크에 저장하려면 어떻게 해야 합니까? (0) | 2023.05.16 |
---|---|
mongoose에서 가중치를 사용한 전체 텍스트 검색 (0) | 2023.05.16 |
어떻게 하면 Git가 심볼 링크를 따르도록 할 수 있습니까? (0) | 2023.05.11 |
커밋 해시가 지정된 GitHub에서 커밋 찾기 (0) | 2023.05.11 |
HTML은 왜 "척노리스"가 색이라고 생각합니까? (0) | 2023.05.11 |