我想在我的系统中实现用户。我知道Django已经有了一个身份验证系统,我一直在阅读文档。但我还不知道
之间的区别from django.contrib.auth.models import User
class Profile(User):
# others fields
并且
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User)
# others fields
我不想知道为什么要使用这一个或另一个,但是在引擎盖下会发生什么。有什么不同?
答案 0 :(得分:9)
您的第一个示例是multi-table inheritance。
class Profile(User):
如果您有profile
,则可以直接访问用户模型上的所有字段(例如profile.username
和profile.email
)。在这种情况下,Django会自动为您创建OneToOneField
。
第二个例子是常规OneToOneField
。
class Profile(models.Model):
user = models.OneToOneField(User)
在这种情况下,您无法访问profile.username
和profile.email
。相反,您可以通过一对一字段访问这些字段(例如profile.user.username
和profile.user.email
)。
在您添加配置文件模型的情况下,我会避免使用继承,而是使用一对一字段。 User
模型具有自定义管理员来处理密码。如果您使用多表继承,那么您的Profile
模型也必须处理此问题。通过使用一对一字段,自定义管理员可以处理用户字段,而您的个人资料模型管理员只需处理其他个人资料字段。
另一个选择是创建custom user model。在这种情况下,您继承了抽象类AbstractUser
或AbstractBaseUser
,而不是类User
。如果您的Profile类有效,那么我建议使用它而不是自定义用户模型,因为自定义用户模型设置起来比较复杂。