【发布时间】:2017-07-22 09:34:28
【问题描述】:
我将postgreSQL 与Django 1.10 和python 3.4 一起使用。我有一个这样定义的Course 模型:
class Course(models.Model):
title = models.CharField(max_length=200, unique=True)
content = models.TextField(max_length=200)
然后我使用以下命令手动将唯一索引添加到 title 列。
CREATE UNIQUE INDEX title_unique on wiki_course (LOWER(title));
假设数据库已经有"Programming Basics" 作为标题。当我将 "programming basics" 添加到 title 并点击 save 时,它会显示以下错误。
IntegrityError at /admin/wiki/course/add/
duplicate key value violates unique constraint "title_unique"
DETAIL: Key (lower(title::text))=(programming basics) already exists.
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/wiki/course/add/
Django Version: 1.10.5
Exception Type: IntegrityError
Exception Value:
duplicate key value violates unique constraint "title_unique"
另一方面,如果我从 MySQL 切换数据库并重试,它会告诉我课程已经存在。
有没有办法在 PostgreSQL 中实现这种行为?
更新:一种解决方案是使用 citext 类型字段作为标题。首先,您必须使用以下命令启用 citext 扩展。
CREATE EXTENSION IF NOT EXISTS citext;
然后使用alter语句来改变所需列的类型。
ALTER TABLE course ALTER COLUMN title TYPE citext;
执行这两个查询后。 Django 在表单中显示错误,而不是抛出 IntegrityError 异常。
如果有人知道更好的解决方案,请发布。
【问题讨论】:
-
因为
unique=True在您的title字段中,所以如果您有相同名称的重复title,它应该返回错误.. -
是的,我知道,但我想在表单中显示错误,而不是例外。 MySQL 开箱即用。有什么办法可以在 PostgreSQL 中完成这件事。我在 Google 群组的某个地方读到过有关此问题的信息,他们建议在 PostgreSQL 中创建函数索引或其他内容。是这样解决这个问题的吗?
-
@SancaKembang 我更新了问题请看一下
标签: python mysql django postgresql