用户管理器方法create()和create_user()

sun*_*hit 8 django django-managers django-users

我遇到了一些对象管理器create()方法的可疑行为User.如果使用此方法,则看起来password不需要字段来创建User对象.结果你得到User空白password.如果您使用create_user方法并且未指定使用不可用的密码password创建User(通过set_unusable_password()).

我不确定为什么create()方法不会raise exception在您尝试创建用户时没有password- 在文档中指定此字段是必需的.有什么不对劲的create()方法/文档?

Fil*_*vić 11

这正是用户模型具有自定义管理器以及UserManager.create_user()创建用户的方法的原因.QuerySet.create()User实例上使用该方法有两个问题:

  1. 如果运行管理命令python manage.py sql,请注意auth_user架构:

    CREATE TABLE "auth_user" (
        ...
        "password" varchar(128) NOT NULL,
        ...
    )
    
    Run Code Online (Sandbox Code Playgroud)

    在SQL中,空字符串''不等于NULL,即ISNULL('') != TRUE.

  2. QuerySet.create()并且QuerySet.update() 不要触发模型验证.模型验证仅在ModelForm实例调用Model.full_clean()实例方法时发生.

    在使用QuerySetAPI 的上下文中直接引发验证错误在Django中没有任何意义.这就是为什么你可以做一些事情,User.objects.create(username='foo', password='')即使CharField().validate(value='', None)会提出ValidationError一个空白字符串.

由于上述原因,您应该推迟使用User.objects.create()并依赖User.objects.create_user()模型自定义管理器中提供的方法.