我使用的是postgreSQL
和Django 1.10
和python 3.4
。我有這樣限定的Course
模型:Django無法使用PostgreSQL的IntegrityError
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"
添加到標題並點擊保存時,它會顯示以下錯誤。
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"
在otherhand如果我從MySQL數據庫切換,然後再試一次它會告訴我的課程已經存在。
有沒有辦法實現PostgreSQL的這種行爲?
請隨身攜帶,我是Django的新手。 感謝
更新:一種解決方案是使用使用citext類型字段標題。要做到這一點首先必須使用以下命令啓用citext擴展。
CREATE EXTENSION IF NOT EXISTS citext;
然後使用alter語句來更改所需的列的類型。
ALTER TABLE course ALTER COLUMN title TYPE citext;
執行這兩個查詢後。 Django在表單中顯示錯誤,而不是拋出IntegrityError
異常。
如果有人知道更好的解決方案,請發佈它。
,因爲'獨特= TRUE'您title'的'領域,所以如果你有重複'同名title',它應該返回錯誤.. –
是的,我知道里面,但我想顯示錯誤在形式上不例外。 MySQL可以直接開箱即用。有什麼辦法可以在PostgreSQL中完成這件事。我在Google小組的某個地方閱讀了這個問題,他們建議在PostgreSQL中創建一個函數索引或其他東西。那是如何解決這個問題的? – Cody
@SancaKembang我更新了問題請看看 – Cody