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).

Вернуться на верх