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

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

【问题讨论】:

    标签: django django-models django-authentication


    【解决方案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(),您可以使用您提到的方法自己创建功能,但它提供了有用的处理和实用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-21
          • 1970-01-01
          • 2022-10-25
          • 1970-01-01
          • 2016-05-16
          • 2011-05-23
          • 1970-01-01
          相关资源
          最近更新 更多