【发布时间】:2015-11-03 15:32:58
【问题描述】:
这是我的自定义用户模型,将电子邮件 ID 作为唯一键(连同用户名)。
class User(AbstractUser):
# some more other fields
class Meta:
unique_together = ('email', )
现在我已经创建了这里提到的自定义后端(用于电子邮件身份验证)Django authentication with custom user model with email-id as unique key
到目前为止,一切看起来都很好,工作正常!我可以登录、注销等
现在我有两行/对象,一个用于超级用户,它同时具有用户名和 emailid,第二行只有 emailid 但用户名是 Null(我从 shell 创建的)。
现在,当我尝试使用一些唯一的电子邮件 ID 创建用户对象时,它会显示完整性错误(在问题标题中提到)。
我使用这个查询创建了一个新用户
u, c = User.objects.get_or_create(email='some-new-unique-email@gmail.com')
根据唯一键定义,它可以接受多个Null值,对吧?
我的实现有什么问题。任何帮助,将不胜感激。
这里是表表示,电子邮件和用户名都是 UNI 和 NOTNULL
mysql> describe myapp_user;
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime | YES | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(30) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(30) | NO | | NULL | |
| email | varchar(254) | NO | UNI | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime | NO | | NULL | |
编辑:
但我仍然对这个表中的第二个条目没有用户名值感到惊讶(检查了两次、repr、bool 等)。如果这是 NOTNULL 列怎么可能。
这是 django shell 的输出-(第一个用户,root 是超级用户,第二个没有用户名。
In [4]: User.objects.all()
Out[4]: [<User: root>, <User: >]
In [5]: User.objects.all().values_list('id', flat=True)
Out[5]: [1L, 2L]
In [6]: User.objects.get(id=2)
Out[6]: <User: >
In [7]: u = User.objects.get(id=2)
In [8]: u.__dict__
Out[8]:
{'_state': <django.db.models.base.ModelState at 0x7f855c325d10>,
'date_joined': datetime.datetime(2015, 8, 11, 7, 37, 42, tzinfo=<UTC>),
'email': u'abc@gmail.com',
'first_name': u'',
'id': 2L,
'is_active': True,
'is_staff': False,
'is_superuser': False,
'last_login': datetime.datetime(2015, 8, 11, 11, 19, 50, tzinfo=<UTC>),
'last_name': u'',
'password': u'pbkdf2_sha256$20000$ylufrgAOMJYI$z8kc2pSckWTn3AHbFgzkP5AwGR9qh8+Mtd/pw3srxQE=',
'username': u''}
In [9]: repr(u.username)
Out[9]: "u''"
In [10]: type(u.username)
Out[10]: unicode
In [11]: bool(u.username)
Out[11]: False
In [12]: str(u.username)
Out[12]: ''
PS:我刚刚注意到,first_name 和 last name 也是 NOTNULL 但它们在两行中都是空的。
【问题讨论】:
-
这是您的实际代码吗?还是正如评论所暗示的那样,您有更多字段?您的
User模型似乎有字段username具有非空约束。 -
不!我没有用户名字段,其他字段包括地址、密码等
-
您是否通过设置 AUTH_CUSTOM_USER 告诉 Django 使用您的自定义模型?硒docs.djangoproject.com/en/1.8/topics/auth/customizing/…
-
当然!我清楚地提到除了上述问题外一切正常。
-
我只能说你的数据库有一列
username有一个NOT NULL约束。你能发布你的实际模型定义吗?
标签: python mysql django django-models