django中User.objects.create_User()与User.objects.create()与User().save()之间的差异

django中User.objects.create_User()与User.objects.create()与User().save()之间的差异,django,django-models,django-authentication,Django,Django Models,Django Authentication,在Django文档中,它使用User.objects.create\u User()创建用户。我很困惑,这和User.objects.create()和User().save()之间有什么区别?这是创建其他模型对象的正常方法。最重要的区别是,如果您向.create()方法提供密码,它将被逐字设置在用户身上,并且将无法用于对用户进行身份验证 >>> user = User.objects.create(username="foo", password=&quo

在Django文档中,它使用
User.objects.create\u User()
创建用户。我很困惑,这和
User.objects.create()
User().save()
之间有什么区别?这是创建其他模型对象的正常方法。最重要的区别是,如果您向
.create()
方法提供密码,它将被逐字设置在用户身上,并且将无法用于对用户进行身份验证

>>> user = User.objects.create(username="foo", password="bar")
>>> user.password
'bar'
相反,
create\u user()
方法散列password参数,然后将其删除

>>> user = User.objects.create_user(username="foo", password="bar")
>>> user.password
'pbkdf2_sha256$120000$2pHBVu3tYYbK$ESG1nbUY2ZhEmstJ7Fzu1DioXmGYXiLw31YDkOGn9E0='


还进行了其他一些“整理”。请参阅上面链接的函数的其余部分。

User.objects.create\u User()
是一个帮助函数,它提供有用的实用程序来创建用户,否则您必须自己创建。根据文件:

创建、保存和返回用户

用户名和密码按给定值设置。电子邮件的域部分自动转换为小写,返回的用户对象将
处于活动状态
设置为
True

如果未提供密码,将调用
set\u unusable\u password()

extra\u fields
关键字参数被传递到用户的
\uuu init\uu
方法,以允许在自定义用户模型上设置任意字段

如果没有
create\u user()
,您可以使用您提到的方法自己创建功能,但它提供了有用的处理和实用程序。

create()
save()
是创建模型实例的通用方法。他们不做任何特定于用户模型的事情,而
create\u User()
method是创建用户的特定方法

>>> user = User.objects.create(username="foo", password="bar")
>>> user.password
'bar'
使用泛型方法创建用户时,设置为密码的值不会被散列。您需要自己这样做

u = User(username="username")
u.set_password("password")
u.save()
另外,如果没有额外的数据库查询,您也不能对
create()
方法执行相同的操作


使用
create_user()
时,用户名和密码设置为给定,密码将自动散列,返回的用户对象将
处于活动状态
设置为True

您应该获得用户模型:

from django.contrib.auth import get_user_model
UserModel = get_user_model()
user = UserModel.objects.create(username="Mr Foo", password="bar")
user.save()
或:


如果我通过扩展
models.Model
而不是
AbstractUser
创建了一个自定义用户会怎么样?因为我将使用
oAuth2
,所以我不需要密码字段。然后,我就可以安全地使用
create
功能了,对吗
create\u user
将不可用,因为它没有扩展
AbstractUser
。正如其他用户在这里回答的那样,
create\u user
方法还有一些其他有用的功能。您的建议是安全的,您可以使用
settings.AUTH\u USER\u MODEL
配置您的自定义用户,但请注意,除了密码字段之外,它还附带其他有用的功能。实际上,建议与标准的
AbstractUser
模型集成。出于惯例,您可以随时使用它,而不必考虑密码字段。谢谢,您帮了大忙