После более глубокого изучения документации Django и прочтения статьи , упомянутой @ sam , в которой объясняется, как реализовать многопользовательские типы в Django, я нашел свой ответ.
Он написан в Django doc о том, что «настоятельно рекомендуется настроить пользовательскую модель пользователя, даже если вам достаточно модели пользователя по умолчанию».
Вот что она дает в моем случае:
class User(AbstractUser):
is_guest = models.BooleanField(default=False)
is_host = models.BooleanField(default=False)
language = models.CharField(max_length=2)
class Host(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
host_field = models.CharField(max_length=500)
class Guest(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
guest_field = models.BooleanField(null=False)
в settings.py:
AUTH_USER_MODEL = 'path.to.User'
Запись гостя или хоста вставляется при создании нового пользователя:
user = User.objects.create_user(...)
if is_host:
Host.objects.create(user=user)
else:
Guest.objects.create(user=user)
Я ценю тот факт, что могуопределить пользовательский «тип» в объекте запроса (с помощью request.user.is_host
).
Расширяя класс пользователя, вы также можете использовать поле email
для входа в систему и сделать его уникальным:
class User(AbstractUser):
[...]
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
Если однажды в производстве вы решили добавить поля в пользовательскую модель, возможно, если вы настроили пользовательскую модель.
В противном случае вы застрянете с профилями, поэтому я советую вамследовать указаниям Django и всегда расширять возможности пользователякласс, даже если вам это не нужно (пока).