Django: Пользователь против UserProfile
Я создаю сайт, где мы спрашиваем у пользователей несколько личных данных (дата рождения, номер телефона, адрес, семейное положение и многое другое).
- Вариант 1: Только модель пользователя. Поместите эти персональные поля в
class User(AbstractUser)
модель
class User(AbstractUser):
birth_date = ...
phone_number = ...
- Вариант 2: Модели User + UserProfile: отделить данные, связанные с входом в систему (
User
) от личных данных (UserProfile
), как:
class User(AbstractUser):
pass
class UserProfile(models.Model):
user = models.OneToOneField(
User,
to_field="id",
primary_key=True,
on_delete=models.CASCADE,
related_name="user_profile",
)
birth_date = ...
phone_number = ...
Какая практика является лучшей?
Это субъективно, основываясь на мнении/потребностях каждого. Но мы рассмотрим технические различия:
Вариант 1 проще использовать в коде и более эффективен, так как вам не нужно делать JOINы между таблицами, чтобы получить всю информацию
.В варианте 2 модель будет выглядеть чище, в ней будут присутствовать только самые важные поля. Это полезно для инженеров по данным или аналитиков данных, которые много работают с инструментами визуализации SQL
.
Если только UserProfile
не имеет 20+ полей, я бы лично выбрал вариант 1.
Как всегда, ответ будет "зависит от ситуации". Если ваши пользователи могут иметь различные типы профилей/ролей, которые могут потребовать дополнительного набора полей, я бы выбрал второй вариант, потому что он позволит вам иметь одну модель пользователя, которая может объединить черты и функциональные возможности нескольких пользователей. В зависимости от ситуации вы можете вызывать конкретный метод профиля (примеры смотрите в Delegation pattern).