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
函数,对吧?由于未扩展AbstractUser
,create_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 3和django通道中的SynchronousOnlyOperation错误