【问题标题】:IntegrityError: (1048, "Column 'username' cannot be null") when emailid is also unique keyIntegrityError: (1048, "Column 'username' cannot be null") 当 emailid 也是唯一键时
【发布时间】: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


【解决方案1】:

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

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

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

MyModel.objects.create 声明中

【讨论】:

  • 不!如果某人的电子邮件 ID 是 aswin@gmail.com 而其他人的电子邮件 ID 是 aswin@yahoo.com,会发生什么情况。那么它将违反唯一条件。我可以连接一些唯一的随机数,但你不认为它会变得很麻烦
  • 我只是好奇我如何能够在不提供用户名值的情况下在 db 中创建第二个条目,如问题详细信息所述。这怎么可能,我用 django shell 创建的
  • 从控制台创建时会覆盖约束。
猜你喜欢
  • 2022-11-04
  • 2022-10-18
  • 2020-11-03
  • 2017-05-05
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多