在幕后,将用户分类和创建一对一字段有什么区别?
问题内容:
我想在系统中实现用户。我知道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
我不想知道为什么要使用一种或另一种,但是在幕后会发生什么。有什么不同?
问题答案:
您的第一个示例是多表继承。
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
模型也必须处理这个问题。通过使用一对一字段,定制管理员可以处理用户字段,而您的Profile模型管理员只需处理其他配置文件字段。
另一种选择是创建自定义用户模型。在这种情况下,您可以继承一个抽象类,AbstractUser
或者AbstractBaseUser
代替该类User
。如果您的Profile类有效,那么我建议您使用它而不是自定义用户模型,因为自定义用户模型的设置更为复杂。