Django 唯一的、空的和空白的 CharField 在管理页面上给出“已经存在”的错误

新手上路,请多包涵

我遇到了有史以来最奇怪的错误。我有一个人物模型

class Person(models.Model):
    user = models.OneToOneField(User, primary_key=True)
    facebook_id = models.CharField(max_length=225, unique=True, null=True, blank=True)
    twitter_id = models.CharField(max_length=225, unique=True, null=True, blank=True)
    suggested_person = models.BooleanField(default=False)

我最近添加了 twitter_id 字段。当我访问 Django 管理页面并尝试将“人”更改为 suggested_person 时,出现以下错误:

  Person with this Twitter id already exists.

我发现这个错误非常奇怪,因为 Facebook_id 字段的设计方式与 Twitter_id 字段完全相同。

这可能是什么原因?

原文由 deadlock 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

由于您有 null=True, blank=Trueunique=True ,django 正在考虑 None 或空白作为唯一条目。删除唯一性约束并处理代码中的唯一性部分。

原文由 karthikr 发布,翻译遵循 CC BY-SA 3.0 许可协议

没有一个答案清楚地描述了问题的根源。

通常在 数据库 中你可以创建一个字段 null=True, unique=True 它会起作用……因为 NULL != NULL 。所以每个空白值仍然被认为是唯一的。

但不幸的是 CharField s Django 将保存一个空字符串 "" (因为当您提交表单时,所有内容都作为字符串进入 Django,您可能真的想保存一个空字符串 "" - Django 不知道它是否应该转换为 None )

这基本上意味着您不应该在 Django 中使用 CharField(unique=True, null=True, blank=True) 。正如其他人指出的那样,您可能必须放弃数据库级唯一约束并在模型中进行自己的唯一检查。

如需进一步参考,请参见此处: https ://code.djangoproject.com/ticket/4136

(不幸的是,在撰写本文时还没有确定好的解决方案)

注意:正如@alasdair 在评论中指出的那样,该错误现已修复 - 自 Django 1.11 以来,您可以使用 CharField(unique=True, null=True, blank=True) 而无需手动将空白值转换为 None

原文由 Anentropic 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题