django 中 User.objects.create_user() vs User.objects.create() vs User().save() 的区别

Posted

技术标签:

【中文标题】django 中 User.objects.create_user() vs User.objects.create() vs User().save() 的区别【英文标题】:Difference between User.objects.create_user() vs User.objects.create() vs User().save() in django 【发布时间】:2020-11-13 05:21:33 【问题描述】:

在 Django 文档中,它使用User.objects.create_user() 创建用户。我很困惑,这和User.objects.create()User().save()有什么区别,这是创建其他模型对象的正常方法

【问题讨论】:

【参考方案1】:

最显着的区别是,如果您向.create() 方法提供密码,它将被逐字设置在用户身上,并且无法用于验证用户身份。

>>> user = User.objects.create(username="foo", password="bar")
>>> user.password
'bar'
>>> user.check_password("bar")
False

相反,create_user() 方法对密码参数进行哈希处理,然后是。

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

见https://github.com/django/django/blob/master/django/contrib/auth/models.py#L145。

其他一些“整理”也完成了。请参阅上面链接的其余函数。

【讨论】:

如果我创建了一个自定义用户,通过扩展models.Model 而不是AbstractUser,因为我将使用oAuth2,所以我不需要密码字段。那么,我可以安全地使用create 函数,对吧?由于未扩展AbstractUsercreate_user 将不可用。 正如其他用户在这里回复的那样,create_user 方法还有一些其他有用的功能。您的建议是安全的,您可以使用settings.AUTH_USER_MODEL 来配置您的自定义用户,但请注意,除了密码字段之外,它还具有其他有用的功能。事实上django-oauth-toolkit.readthedocs.io 建议与标准AbstractUser 模型集成。您可以随时使用它以保持约定,而忽略密码字段。 谢谢,你很有帮助 需要注意和注意的一点是,在没有内置 create_user 函数的情况下创建 User 可能会导致其他依赖于加密密码的函数出现问题。例如,在测试期间,您可能希望用户为特定请求登录,例如 testing with DRF【参考方案2】:

你应该得到用户模型:

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

或者:

user = UserModel.objects.create_user("Mr Foo", password="bar")
user.save()

【讨论】:

【参考方案3】:

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

使用泛型方法创建用户时,你设置为密码的值不会被hash。你需要像这样自己做。

u = User(username="username")
u.set_password("password")
u.save()

如果没有额外的数据库查询,您也不能对 create() 方法执行相同的操作。

使用create_user() 时,用户名和密码设置为给定,密码将自动进行哈希处理,返回的用户对象将is_active 设置为True

【讨论】:

【参考方案4】:

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

创建、保存和返回用户

用户名和密码设置为给定。电子邮件的域部分会自动转换为小写,并且返回的用户对象会将is_active 设置为True

如果没有提供密码,将调用set_unusable_password()

extra_fields 关键字参数被传递给用户的 __init__ 方法,以允许在自定义用户模型上设置任意字段。

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

【讨论】:

以上是关于django 中 User.objects.create_user() vs User.objects.create() vs User().save() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

django-在Django中选择文件后预览照片

在标题 Django 管理工具中隐藏 Django 徽标/名称

models.py中增加了字段,django中怎样更新

django 3和django通道中的SynchronousOnlyOperation错误

[django]在windows下搭建Django的虚拟环境

Django:如何在 Django 表单中多次包含相同的字段?