繁体   English   中英

IntegrityError:(1048,“用户名列不能为空”),如果emailid也是唯一键

[英]IntegrityError: (1048, “Column 'username' cannot be null”) when emailid is also unique key

这是我的自定义用户模型,具有电子邮件ID作为唯一键(以及用户名)。

class User(AbstractUser):
    # some more other fields
    class Meta:
        unique_together = ('email', )

现在,我已经创建了此处提到的自定义后端(用于电子邮件身份验证), 使用自定义用户模型的Django身份验证,其中以email-id作为唯一密钥

到现在为止一切看起来都很好,可以正常工作!我可以登录,注销等

现在,我有两行/对象,一个用于超级用户,同时具有用户名和emailid,第二行仅具有emailid但用户名为Null(我是从Shell创建的)。

现在,当我尝试使用一些唯一的电子邮件ID创建User对象时,它显示完整性错误(问题标题中提到)。

我使用此查询创建了一个新用户

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和lastname也为NOTNULL,但两行中均为空。

基本上,Django用户(或AbstractUser)模型具有用户名作为NOT NULL约束。 因此,通过添加此约束,您只需添加电子邮件的唯一约束。

username is NOT NULL仍然具有username is NOT NULL约束。 您可以将用户名配置为具有电子邮件地址本身,例如

username = email.split('@')[0]

MyModel.objects.create语句中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM