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实例上使用该方法有两个问题:
如果运行管理命令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.
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()模型自定义管理器中提供的方法.