Django Модель пользователя с одинаковыми полями
Я видел учебник о том, как расширить модель django путем предоставления отношений 1-к-1 к модели пользователя django. Мой вопрос заключается в том, что если у нас есть одинаковые поля в модели User и profile(extend from user), т.е. email и имя пользователя. Когда пользователь регистрируется на нашем сайте, используя модель User, будет ли модель профиля наследовать то же имя пользователя и email от модели User?
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=200, blank=True, null=True)
email = models.EmailField(max_length=500, blank=True, null=True)
location = models.CharField(max_length=200, blank=True, null=True)
Когда пользователь регистрируется на нашем сайте, используя
Userмодель, будет лиProfileмодель наследовать то же имя пользователя и email отUserмодели?
Нет, вы не наследуете от модели пользователя, вы просто создаете новую модель, которая ссылается на пользователя, и она случается, чтобы иметь некоторые одинаковые поля. Это также было бы плохо с точки зрения проектирования программного обеспечения. Представьте себе, что вы позже добавляете поле в модель пользователя и каким-то образом оно оказывается таким же, как Profile, тогда внезапно данные должны быть другими?
Нет необходимости хранить данные в Profile лишний раз. Если у вас есть объект Profile, например my_profile, вы можете получить доступ к адресу электронной почты, хранящемуся у связанного пользователя, с помощью:
my_profile.user.email
Вы также можете создать свойства, которые будут получать его от пользователя, например:
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=True
)
location = models.CharField(max_length=200, blank=True, null=True)
@property
def name(self):
if self.user_id is not None:
return self.user.username
@property
def email(self):
if self.user_id is not None:
return self.user.email
Хранение одинаковых данных является формой дублирования данных и часто усложняет сопровождение программного обеспечения: это означает, что для каждого обновления модели User или модели Profile вам придется синхронизироваться с другой моделью. Это может легко пойти не так, в результате чего Profile может иметь другой адрес электронной почты, чем связанный с ним User и наоборот, что приводит к множеству проблем, когда человек посылает электронные письма на неправильный адрес электронной почты и т.д.
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL[Django-doc] для ссылки на модель пользователя, чем использоватьUserмодель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUserмодель раздел документации .