django.contrib.auth.user的唯一电子邮件约束

django.contrib.auth.user的唯一电子邮件约束,django,django-models,django-south,django-authentication,Django,Django Models,Django South,Django Authentication,我更改了django.contrib.auth.user模型,使电子邮件id唯一。之后,我添加了一个数据迁移来反映相同的情况- python manage.py数据迁移appname唯一\u密码。 然后是python manage.py schemamigration appname--auto-->无更改。最后,python manage.py迁移appname 正向迁移到0003\u唯一\u密码 appname:0037_unique_password.py 现在,当我添加一个电子邮件

我更改了django.contrib.auth.user模型,使电子邮件id唯一。之后,我添加了一个数据迁移来反映相同的情况-

  • python manage.py数据迁移appname唯一\u密码。 然后是python manage.py schemamigration appname--auto-->无更改。最后,python manage.py迁移appname

  • 正向迁移到0003\u唯一\u密码

  • appname:0037_unique_password.py
现在,当我添加一个电子邮件不唯一的用户时,它会给我一个错误,并且不允许我通过django admin创建该用户。但当我这样做的时候: >

  • python manage.py shell

  • 从django.contrib.auth.models导入用户

  • user=user('cust1','123','xxx@gmail.com') 这将创建一个用户对象,即使'xxx@gmail.com"已经存在

如何为现有项目(含数据)向django.contrib.auth.user.email添加唯一约束?

根据模型验证在模型验证期间检查唯一性。对模型调用
save()
,不会自动导致模型验证。管理员应用程序将调用模型验证

没有任何东西阻止您在Python中创建
User
对象,例如
User=User('cust1','123','xxx@gmail.com)
然后执行
user.save()
。如果在数据库级别进行唯一性检查,此时可能会出现异常。如果要在保存之前进行检查,请在模型实例上调用
is\u valid()


如果您希望每个
用户
对象在保存前自动验证,请在继续保存之前使用Django信号进行模型验证。

谢谢Austin…但是如果我可以在db级别做更多的事情??!!您的迁移应该添加了db级别的约束。你的问题是否暗示
用户('cust1','123','xxx@gmail.com“)。save()在
xxx@gmail.com
数据库中已存在?是。它不会创建异常。它只是用这些值将其添加到数据库中:|有趣。您使用的是什么数据库后端?
manage.py sqlall
的输出是否与数据库表的当前结构匹配?您应该在数据库
CREATE TABLE
定义中看到一个
UNIQUE
约束。