Django.fun

В чем разница между AbstractUser и AbstractBaseUser в Django?

Важно понимать разницу между AbstractUser и AbstractBaseUser в Django, это поможет вам принять правильное решение, какой из них использовать при запуске проекта Django.

AbstractUser

В документации Django говорится, что AbstractUser обеспечивает полную реализацию пользователя по умолчанию в качестве абстрактной модели, что означает, что вы получите полные поля, которые поставляются с моделью пользователя, плюс поля, которые вы определяете.

Пример

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

class MyUser(AbstractUser):
    address = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField()

В приведенном выше примере вы получите все поля модели User плюс поля, которые мы здесь определили, а именно address и birth_date.

AbstractBaseUser

AbstractBaseUser имеет только функцию аутентификации, у него нет фактических полей, вы предоставите поля для использования при создании подкласса.

Вы также должны указать, какое поле будет представлять имя пользователя, обязательные поля и способы управления этими пользователями.

Допустим, вы хотите использовать электронную почту для аутентификации, Django обычно использует имя пользователя для аутентификации, так как же изменить его для использования электронной почты?

Пример

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


class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']

USERNAME_FIELD ‒ это строка, описывающая имя поля в пользовательской модели, которое используется в качестве уникального идентификатора.

В приведенном выше примере адрес электронной почты используется в качестве поля идентификации.

Важно отметить, что вы также можете установить электронную почту в качестве своего уникального идентификатора с помощью AbstractUser, это можно сделать, установив username = None и USERNAME_FIELD = 'email', как показано ниже.

Пример

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


class MyUser(AbstractUser):
    username = None
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = MyUserManager()

    def __str__(self):
        return self.email

Какой из них вы должны использовать?

Если вам нужен полный контроль над моделью User, лучше использовать AbstractBaseUser, но если вы просто добавляете вещи к существующему пользователю, например, вы просто хотите добавить дополнительное поле, например, поле местоположения или любые другие данные профиля, тогда используйте AbstractUser.

Поделитесь с другими: